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

    比如你爬取一个页面,爬取主页面是一个线程,爬取详情页又是一个线程,
    当你把主页面的内容拿到之后,你是否就需要将其发送给处理详情页的那个线程了。
    这就涉及到进程通讯问题了。

    线程间通讯一般有两种方式,共享变量和Queue

    1.共享变量

    共享变量利用的是线程之间共享运行环境这一机制。
    但是使用共享变量,可能不能得到预期结果,因为GIL锁的缘故,
    如果你一定要这样做,可以使用线程互斥锁来解决。

    from threading import Thread
    import random
    import time
    
    def gen_code():
        """随机生成6威验证码"""
        new_list = []
        for i in range(6):
            num = random.randint(48,57)
            new_list.append(chr(num))
        new_str = "".join(new_list)
        new_code = int(new_str)
        return new_code
    
    
    data_list = []
    def get_data():
        global data_list
        for i in range(5):
            new_code = gen_code()
            data_list.append(new_code)
            print("生成验证码%d"%new_code)
    
    def handle_data():
        global data_list
        new_code = data_list.pop()
        #将验证码发送给用户
        time.sleep(3)
        print("已经发送了%s"%new_code)
    
    if __name__ == "__main__":
        t1 = Thread(target=get_data)
        t1.start()
        for i in range(5):
            t2 = Thread(target=handle_data)
            t2.start()
        print("执行结束")

    执行结果:
      生成验证码63564
      生成验证码52472
      生成验证码144956
      生成验证码748569
      生成验证码312201
      执行结束
      已经发送了144956
      已经发送了748569
      已经发送了63564
      已经发送了52472
      已经发送了312201

    2.Queue

    Queue内部使用deque双端队列

    from threading import Thread
    import random
    import time
    from queue import Queue
    
    def gen_code():
        """随机生成6威验证码"""
        new_list = []
        for i in range(6):
            num = random.randint(48,57)
            new_list.append(chr(num))
        new_str = "".join(new_list)
        new_code = int(new_str)
        return new_code
    
    
    def get_data(data_queue):
        for i in range(5):
            new_code = gen_code()
            data_queue.put(new_code)
            print("生成验证码%d"%new_code)
    
    
    def handle_data(data_queue):
        global data_list
        new_code = data_queue.get()
        #将验证码发送给用户
        time.sleep(3)
        print("已经发送了%s"%new_code)
    
    if __name__ == "__main__":
        data_queue = Queue(maxsize=100)
        t1 = Thread(target=get_data,args=(data_queue,))
        t1.start()
        for i in range(5):
            t2 = Thread(target=handle_data,args=(data_queue,))
            t2.start()
        print("执行结束")

    使用Queue这种队列的时候,线程之间就是安全的。
    这种方式在进程中无法适用,同时可以执行插入方向和优先级。

  • 相关阅读:
    19牛客暑期多校 round2 H 01矩阵内第二大矩形
    NOIP2017滚粗记
    Left 4 Dead 2(求生之路2) 游戏打不开 游戏闪退 的一种可能性以及解决方法
    Luogu P1156 垃圾陷阱
    Luogu P1376 机器工厂
    Luogu P1842 奶牛玩杂技
    Luogu P1880 石子合并
    Luogu P1441 砝码称重(fj省选)
    Luogu P1077 摆花
    Luogu P1282 多米诺骨牌
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/11289795.html
Copyright © 2011-2022 走看看