多线程-2-线程间通信
目录
共享变量
队列
在 Python 中,实现线程间通信有多种方法,主要依赖 threading 和 queue 模块。这些机制可以帮助你安全地在多个线程之间传递数据和同步操作。
共享变量
由于同一进程中的所有线程共享内存空间,因此最直接的通信方式就是使用全局或共享的变量。但是,为了防止多个线程同时修改数据而导致的竞态条件(Race Condition),必须使用同步原语来保护数据。
队列
这是 最常用且推荐 的线程间通信方式。 queue 模块提供了线程安全的队列类(如 Queue , LifoQueue , PriorityQueue ),它们内部已经处理好了所有的锁定机制,让你无需手动管理锁。
# 通过queue的方式进行线程同步
import threading
from time import sleep
import time
import queuedef get_detail_html(queue):while True:print("get detail html started")sleep(2) data = queue.get()print(f"get detail html end, data: {data}")def get_detail_url(queue):while True:print("get detail url started")sleep(2)for i in range(20):queue.put(i)print(f"get detail url end, size: {queue.qsize()},queue:{queue}")if __name__ == "__main__":detail_queue = queue.Queue()t1 = threading.Thread(target=get_detail_url, args=(detail_queue,))for i in range(15):t = threading.Thread(target=get_detail_html, args=(detail_queue,))t.start()start_time = time.time()t1.start()# 使用join方法使得主线程等待线程执行完成 否则主线程不会等待子线程,就会导致,子线程执行中的时候,主线程执行时间加减t1.join()# 任务结束detail_queue.task_done()# 使用queue提供的方法管理其中的所有线程detail_queue.join()end_time = time.time()print(end_time - start_time)