多线程的问题,谢谢老师

多线程的问题,谢谢老师

# 具体遇到的问题
为什么我设置了3个线程,但是执行起来只是使用了1号线程,等1号线程把数据全部跑完之后,2号和3号才开始启动并停止?http://img1.sycdn.imooc.com//climg/5fe1f5aa0875629704680233.jpg# 报错信息的截图

# 相关课程内容截图

# 尝试过的解决思路和结果

# 粘贴全部相关代码,切记添加代码注释(请勿截图)

在这里输入代码,可通过选择【代码语言】突出显示

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好,课程中将三个线程启动后添加到了列表中,在循环得到列表中的线程,执行join()挂起主线程等待子线程执行结束,即线程1执行完后再执行线程2

http://img1.sycdn.imooc.com//climg/5fe2a50e091513f910230256.jpg

http://img1.sycdn.imooc.com//climg/5fe2a518097513ef07220135.jpg

  • 慕姐0286248 提问者 #1

    但是在老师的视频中,是3个线程同时启动并跑程序,而不是1号线程跑完了再跑2号3号。为什么我和老师不一样?


    http://img1.sycdn.imooc.com//climg/5fe2af830896881c12690626.jpg

    2020-12-23 10:46:30
  • 好帮手慕美 回复 提问者 慕姐0286248 #2

    同学,你好,同学可以看下是否只是输出结果时顺序不对,可以去掉打印url语句,

    http://img1.sycdn.imooc.com//climg/5fe2b8df09abc2a205540366.jpg

    多线程在输出的时候结果有时候并不是按顺序输出的,当一个线程正在打印的时候,cpu切换到了另一个线程,所以产生了不正确的结果。

    或者同学可以将代码提供下方便更好的为您解决。

    祝学习愉快~~~~

    2020-12-23 11:26:35
  • 慕姐0286248 提问者 回复 好帮手慕美 #3
    import requests
    import re
    from multiprocessing import Queue
    import threading

    class Crawl_page(threading.Thread):
    '''用于给页码发送请求'''
    #请求的url https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,1.html
    def __init__(self,thread_name,page_queue,data_queue):
    super(Crawl_page,self).__init__()
    #线程名称
    self.thread_name = thread_name
    #页码队列
    self.page_queue = page_queue
    #数据队列
    self.data_queue = data_queue
    #定义一个请求头
    self.header = {
    "Host": "jobs.51job.com",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-User": "?1",
    "Sec-Fetch-Dest": "document",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "zh-CN,zh;q=0.9",
    }

    #该线程要做的事情
    def run(self):
    '''多线程的启动方法'''
    print('当前启动的线程名称:{}'.format(self.thread_name))
    #使用nowait不会阻塞,当队列无数据会抛异常
    while not page_flag:
    try:
    #获取页码
    page = self.page_queue.get_nowait()
    except:
    pass
    else:
    # pass
    print('当前页码:{}'.format(page))
    page_url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,'+str(page)+'.html'
    print('当前请求页面是:{}'.format(page_url))
    response = requests.get(url=page_url,headers=self.header)
    response.encoding = 'gbk'
    self.data_queue.put(response.text)

    2020-12-23 11:54:06
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
4.入门主流框架Scrapy与爬虫项目实战
  • 参与学习           人
  • 提交作业       107    份
  • 解答问题       1672    个

Python最广为人知的应用就是爬虫了,有趣且酷的爬虫技能并没有那么遥远,本阶段带你学会利用主流Scrapy框架完成爬取招聘网站和二手车网站的项目实战。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师