线程间通信

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

线程间通讯一般有两种方式,共享变量和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这种队列的时候,线程之间就是安全的。
这种方式在进程中无法适用,同时可以执行插入方向和优先级。

posted @ 2019-08-02 17:03  明王不动心  阅读(196)  评论(0编辑  收藏  举报