python多协程开发(微线程丶纤程)

python对于并发的处理有多进程,多线程和多协程

在python提供的并发编程中,多协程的开发是性能最高的一种实现形式,多线程有GIL锁的问题;
多协程的资源控制是交给开发者来进行控制的,多进程和多线程都是有操作系统进行控制的,会有各种轮转,执行了一段时间就会让出资源,交给其他进程或者是线程进行处理,这样的处理会有性能开支;

在这里插入图片描述

1.yeild实现多协程

对于当前的程序开发没有系统级的处理控制,
如果忘记yield如何使用的话请点击此处
参考下廖雪峰的

# 生产者
def producer(cons):
    # 生产数据
    info = None;
    cons.send(info);
    for item in range(10):
        if item % 2 ==0:
            info = "title = 奥特曼,content = 奥特曼打怪兽";
        else:
            info = "title = 黑猫警长,content = 黑猫警长抓老鼠";
        print("【生产者:{}】".format(info));
        cons.send(info);

def consumer():
    while True:
        # 等待进行数据的接受
        receive = yield ;
        # 消费者输出信息
        print("【消费者:{}】".format(receive));
def main():

    con = consumer();
    producer(con);

if __name__ == '__main__':
    main();

2.greenlet是一种python中提供的多线程开发的模块支持,需要手动下载一下
pip install greenlet
下面代码可以看到无需send和yield这些来进行操作了;

import greenlet,time
info = None;
def producer_handle():
    global info;
    for item in range(10):
        if item % 2 == 0:
            info = "title = 奥特曼,content = 奥特曼打小怪兽";
        else:
            info = "title = 黑猫警长,content = 黑猫警长抓小老鼠";
        print("【生产者】:{}".format(info));
        # 模拟业务逻辑处理
        time.sleep(1);
        # 切换到消费端;
        consumer_greenlet.switch();

def consumer_handle():
    while True:
        print("【消费者】:{}".format(info));
        time.sleep(1);
        # 切换到生产端
        producer_greenlet.switch();
# 定义协程切换函数
producer_greenlet = greenlet.greenlet(run=producer_handle);
# 定义协程切换函数
consumer_greenlet = greenlet.greenlet(run=consumer_handle);

def main():
    producer_greenlet.switch();

if __name__ == '__main__':
    main();

3.gevent第三方模块 和greenlet的区别
greenlet需要手动切换生产消费,gevent自动切换
需要手动下载 pip install gevent
下面是示例代码,由于是while true所以会一直消费最后一条消息

import gevent
info = None;
def producer_handle():
    global info;
    for item in range(10):
        if item % 2 == 0:
            info = "title = 奥特曼,content = 奥特曼打小怪兽 ,{}".format(item);
        else:
            info = "title = 黑猫警长,content = 黑猫警长抓小老鼠 ,{}".format(item);
        print("【生产者】:{}".format(info));
        # 切换延迟
        gevent.sleep(1);

def consumer_handle():
    while True:
        print("【消费者】:{}".format(info));
        # 切换延迟
        gevent.sleep(1);

def main():
    # 定义协程对象
    producer_gevent = gevent.spawn(producer_handle);
    # 定义协程对象
    consumer_gevent = gevent.spawn(consumer_handle);
    producer_gevent.join();
    consumer_gevent.join();

if __name__ == '__main__':
    main();

其实可以发现python不断的在完善自己并且引入一些新特性,对于新手和不懂计算机硬件的人来说,是越来越友好了,写的少,干得多;

猜你喜欢

转载自blog.csdn.net/weixin_44887276/article/details/114882099