网络编程十一:线程间的通讯

总结,线程间的同步的五种方式:

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)    收藏  举报

导航