Python 生产者和消费者(线程笔记总结)

'''
生产者与消费者:两个线程之间的通信

Python的queue模块中提供了同步的、线程安全的队列类,包括FIFO(先进先出)队列Queue,
LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语
(可以理解为原子操作,即要么不做要么就做完),能够在多线程中直接使用。
可以使用队列来实现线程间的同步


'''
import threading
import sys
import queue
import random
import time

def produce(q):
    i=0
    while i<10:
        num=random.randint(1,100)
        q.put("生产者产生数据: %d" % num)
        print("生产者产生数据: %d" % num)
        time.sleep(1)
        i+=1
    q.put(None)
    #完成任务
    q.task_done()

def consume(q):
    while True:
        item = q.get()
        if item is None:
            break
        print('消费者获取到: %s ' % item)
        time.sleep(4)
    #完成任务
    q.task_done()

def main():
    pass

if __name__ == "__main__":
    q=queue.Queue(10)
    arr = []

    #创建生产者
    th = threading.Thread(target=produce,args=(q,))
    th.start()

    #创建消费者
    tc = threading.Thread(target=consume,args=(q,))
    tc.start()

    th.join()
    tc.join()
    sys.exit(int(main() or 0))

'''
线程:Thread

1. 创建线程
  
    A.t = Thread(target=func,name='',args=(),kwarfs={})
     t.start() ---->就绪状态

     run()
    join()等待当前子线程执行完后,主线程才会结束。
    func的内容给run,然后start调用run这就是func.
  
   B. 自定义线程
    class MyThread(Thread):
        def _init__(self,name):
            super().__init__
                self.name=name
          def run(self):
               任务

    t = MyThread()
    t.start()

2. 数据共享
        进程共享数据与线程共享数据的区别:
        进程是每个进程中都有一份
        线程是共用一个数据  -->数据安全性问题

        GIL  ----> 伪线程

        lock = Lock()
        lock.acquire()
        ......
        lock.release()

        ---->只要用锁:死锁
        避免死锁

3.线程间通信:生产者与消费者
    生产者:线程
    消费者:线程

    q=queue.Queue(10)
    #创建生产者
    th = threading.Thread(target=produce,args=(q,))
    th.start()

    #创建消费者
    tc = threading.Thread(target=consume,args=(q,))
    tc.start()
    
    q.put()
    q.get()

扩展:GIL

'''
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ou.cs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值