线程间通信--共享变量和Queue
1.线程通信方式--共享变量
缺点,共享变量需要加锁,来达到我们想要的效果
#!/user/bin/env python # -*- coding:utf-8 -*- # 对于io操作来说,多线程和多进程性能差别不大 # 1.通过Thread类实例化 import time import threading detail_url_list = [] def get_detail_html(detail_url_list): # 使用共享变量 # global detail_url_list while True: if len(detail_url_list): url = detail_url_list.pop() # 爬取文章详情页 print('get detail html started') time.sleep(2) print('get detail html end') def get_detail_url(detail_url_list): while True: # 使用共享变量 # global detail_url_list # 爬取文章列表页 print('get detail url started') time.sleep(2) for i in range(20): detail_url_list.append('http://projectsedu.com/{id}'.format(id=i)) print('get detail url end') # 1.线程通信方式-共享变量 if __name__ == '__main__': start_time = time.time() thread_detail_url = threading.Thread(target=get_detail_url, args=(detail_url_list,)) thread_detail_url.start() for i in range(10): thread_detail_html = threading.Thread(target=get_detail_html, args=(detail_url_list,)) thread_detail_html.start() print('last time: {}'.format(time.time() - start_time))
ps:不要去尝试去运行,我设置了while循环,而且没有设置守护线程。。。
2.通过queue的方式进行线程间的通信
#!/user/bin/env python # -*- coding:utf-8 -*- # 2.通过queue的方式进行线程间的通信 from queue import Queue import time import threading detail_url_list = [] def get_detail_html(queue): while True: # 队列的get方法是一个阻塞的函数,即如果队列为空,就阻塞 url = queue.get() # 爬取文章详情页 print('get detail html started') time.sleep(2) print('get detail html end') def get_detail_url(queue): while True: # 爬取文章列表页 print('get detail url started') time.sleep(2) for i in range(20): # 向队列里面插入数据 # put也是一个阻塞函数,当队列已满的时候,会阻塞 queue.put('http://projectsedu.com/{id}'.format(id=i)) print('get detail url end') # 1.线程通信方式-共享变量 if __name__ == '__main__': # 最好设置一个最大值,不然太大了,回对内存有影响 detail_url_queue = Queue(maxsize=1000) start_time = time.time() thread_detail_url = threading.Thread(target=get_detail_url, args=(detail_url_queue,)) thread_detail_url.start() for i in range(10): thread_detail_html = threading.Thread(target=get_detail_html, args=(detail_url_queue,)) thread_detail_html.start() print('last time: {}'.format(time.time() - start_time))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现