网络编程十一:线程间的通讯
总结,线程间的同步的五种方式:
Event,Lock,Condition,Barrier,Semaphore
除了以上五种同步方式,解决共享资源,同步的问题。
python还提供专有的线程之间的通讯,可以解决共享资源,同步的问题。
一、queue队列
queue的优点:
queue是一个先进先出的容器,比线程的五种方式实现的线程之间的同步(如之前用condition实现的生产者-消费模型),更好使用。
queue,是队列,因此是可以暂存数据的。
queue的缺点:
无法广播
当需要广播的时侯,通过将queue和condition一起使用。queue可以暂存数据,condition可以广播。
以queue实现的生产者、消费者模型的示例:
import queue import threading import random import logging logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(levelname)s [%(threadName)s %(message)s]")
def producer(q: queue.Queue, event: threading.Event): while not event.wait(3): # 每3秒产生一条数据 data = random.randint(0, 100) logging.info("产生了一条数据: {}".format(data)) q.put(data) def consumer(q: queue.Queue, event: threading.Event): while not event.wait(3): # 每3秒消费一条数据 data = q.get() logging.info("消费了一条数据: {}".format(data)) q = queue.Queue() e = threading.Event() threading.Thread(target=consumer, name="consumer", args=(q, e)).start()
当启动消费者之后,并没有数据输出
再启动生产者之后,开始生产--消费数据
threading.Thread(target=producer, name="producer", args=(q, e)).start()
结果:
2018-12-11 22:44:47,626 INFO [producer 产生了一条数据: 85] 2018-12-11 22:44:47,636 INFO [consumer 消费了一条数据: 85] 2018-12-11 22:44:50,641 INFO [producer 产生了一条数据: 8] 2018-12-11 22:44:50,666 INFO [consumer 消费了一条数据: 8] 2018-12-11 22:44:53,644 INFO [producer 产生了一条数据: 62] 2018-12-11 22:44:53,681 INFO [consumer 消费了一条数据: 62]
通过e.set()终止生产--消费者函数,结束线程。
posted on 2018-12-11 22:40 myworldworld 阅读(86) 评论(0) 收藏 举报