Python多线程通信

为什么需要通信

在生产者和消费者的模型中,如果有一个生产者和多个消费者,消费者之间就需要线程节的通信,避免重复读取同一个数据。

通信方法

共享变量

共享变量介绍

共享变量是最简单粗暴的方式进行多线程之间的通信,使用Python的 global关键字,把一个list变为全局变量,然后对这个全局变量进行添加和获取。

优点就是简单粗暴,浅显易懂,容易写代码,容易理解,同样缺点也有很多。
缺点:
操作不是线程安全的,即使判断的时候变量不是空的,获取的时候也有可能变成空的。

实现

#线程间的通信
#1.共享变量

import threading
import time

itemList = []

#定义消费者
def Consumer(url):
    global itemList

    while True:
        if len(itemList):
            i = itemList.pop()
            time.sleep(2)
            print('Consumer',i)
            
#定义生产者
def Producer(url):
    global itemList

    for i in range(10):
        print('Producer', url + str(i))
        itemList.append(url+str(i))


if __name__ == "__main__":
    thread1 = threading.Thread(target=Producer,args=("www.baidu.com",))
    threadList = [threading.Thread(target=Consumer,args=("",) ) for i in range(2)]

    thread1.start()
    thread1.join()
    for thead in threadList:
        thead.start()

结果:
在这里插入图片描述

消息队列(Queue)实现通信

消息队列介绍

比起共享变量,Queue本身是线程安全的,并且可作为参数传入进不同的线程,让代码更简单易懂。

blcok参数为是否阻塞,如果是True就是阻塞式的,如果当前没有值,阻塞式的就会一直等待新的东西出现。阻塞式的可以比非阻塞式的消耗更少的计算资源,因为不会再空队列的时候一直执行 while True

实现

import threading
import time
from queue import Queue

itemList = []

def Consumer(url,queue):

    while True:
        i = queue.get(block = True)
        time.sleep(2)
        print('Consumer',i)

def Producer(url,queue):

    for i in range(10):
        print('Producer', url + str(i))
        queue.put(url+str(i))


if __name__ == "__main__":
    urlQueue = Queue(maxsize=200)
    thread1 = threading.Thread(target=Producer,args=("www.baidu.com",urlQueue))
    threadList = [threading.Thread(target=Consumer,args=("",urlQueue) ) for i in range(2)]

    thread1.start()
    thread1.join()
    for thead in threadList:
        thead.start()

运行结果和全局变量类似,但是这种方法效率更高。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值