zoukankan      html  css  js  c++  java
  • 08_线程间通信 ITC

    1.线程间的通信方式

        1.共享全局变量

        2.线程队列(queue)

        3.信号量(Semaphore)

    2.共享全局变量进行通信

    from threading import Thread
    import time
    
    g_nums = [11,22,33]
    
    
    def work1(nums):
        nums.append(44)
        print("----in work1---",nums)
    
    
    def work2(nums):
        #延时一会,保证t1线程中的事情做完
        time.sleep(1)
        print("----in work2---",nums)
    
    
    t1 = Thread(target=work1, args=(g_nums,))
    t1.start()
    t2 = Thread(target=work2, args=(g_nums,))
    t2.start()

    3.共享全局变量的资源竞争

    # 多个线程同时对同一个全局变量操作,会出现资源竞争问题,从而数据结果会不正确
    import threading
    import time
    
    g_num = 0
    
    
    def work1(num):
        global g_num
        for i in range(num):
            g_num += 1
        print("----in work1, g_num is %d---" % g_num)
    
    
    def work2(num):
        global g_num
        for i in range(num):
            g_num += 1
        print("----in work2, g_num is %d---" % g_num)
    
    
    print("---线程创建之前g_num is %d---" % g_num)
    
    t1 = threading.Thread(target=work1, args=(1000000,))
    t1.start()
    t2 = threading.Thread(target=work2, args=(1000000,))
    t2.start()
    
    while len(threading.enumerate()) != 1:
        time.sleep(1)
    
    print("2个线程对同一个全局变量操作之后的最终结果是:%s" % g_num)

    4.线程队列queue.Queue-生产者消费者模式

    from threading import Thread
    import queue
    from time import sleep
    
    
    # 生产者
    class Producer(Thread):
        def run(self):
            count = 0
            while True:
                if q.qsize() < 50:
                    for i in range(3):
                        count += 1
                        msg = "产品%d" % count  # 将产品放入队列
                        q.put(msg)
                        # print("生产了: %s 还有%s个" % (msg, q.qsize()))
                sleep(1)
    
    
    # 消费者
    class Customer(Thread):
        def run(self):
            while True:
                if q.qsize() > 20:
                    for i in range(2):
                        msg = q.get()  # 从仓库中拿货
                        print("消耗了: %s 还有%s个" % (msg, q.qsize()))
                sleep(1)
    
    
    def main():
        # 创建一个队列仓库
        global q
        q = queue.Queue()
        # 创建2个生产
        for i in range(2):
            p = Producer()
            p.start()
        # 创建3个消费
        for i in range(3):
            c = Customer()
            c.start()
    
    
    if __name__ == "__main__":
        main()
    """执行结果
        消耗了: 产品1 还有20个
        消耗了: 产品2 还有22个
        消耗了: 产品3 还有24个
        消耗了: 产品1 还有23个
        消耗了: 产品2 还有25个
        消耗了: 产品3 还有24个
        消耗了: 产品4 还有23个
        消耗了: 产品5 还有22个
    """

    5.线程队列-先进先出队列,后进先出队列,优先级队列

    from multiprocessing import Queue  # 是用于多进程的队列,就是专门用来做进程间通信(IPC)
    import queue  # 是用于同一进程内的队列,不能做多进程之间的通信
    
    q = queue.Queue()
    # 先进先出
    q.put(1)
    q.put(2)
    q.put(3)
    print(q.get())
    print(q.get())
    
    q = queue.LifoQueue()
    # 后进先出的队列
    q.put(1)
    q.put(2)
    q.put(3)
    print(q.get())
    
    q = queue.PriorityQueue()
    # 优先级队列,put()方法接收的是一个元组(),第一个位置是优先级,第二个位置是数据
    # 优先级如果是数字,直接比较数值
    # 如果是字符串,是按照 ASCII 码比较的,当ASCII码相同时,会按照先进先出的原则
    q.put((1, 'abc'))
    q.put((5, 'qwe'))
    q.put((-5, 'zxc'))
    print(q.get())
    print(q.get())

    6.信号量-Semaphore

    from threading import Semaphore
    from threading import Thread
    import time
    
    
    def func(sem, i):
        sem.acquire()
        print('第%s个人进入屋子' % i)
        time.sleep(2)
        print('第%s个人离开屋子' % i)
        sem.release()
    
    
    sem = Semaphore(5)
    for i in range(20):
        t = Thread(target=func, args=(sem, i))
        t.start()
  • 相关阅读:
    关于Android的布局
    一个新的开端
    Flux的基础概念和实战入门
    在Redux中使用插件createAction之后
    学习
    Object.assign() 对象的扩展
    Redux 中的CombineReducer的函数详解
    React组件的防呆机制(propTypes)
    css的新特性 calc () 使用
    shim和polyfill有什么区别
  • 原文地址:https://www.cnblogs.com/tangxuecheng/p/13620979.html
Copyright © 2011-2022 走看看