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不断的在完善自己并且引入一些新特性,对于新手和不懂计算机硬件的人来说,是越来越友好了,写的少,干得多;