博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
14 协程:微线程
阅读量:4455 次
发布时间:2019-06-08

本文共 1849 字,大约阅读时间需要 6 分钟。

1.什么是协程

 

2.io密集型,计算密集型

 

 

 3.协程一个简单实现

import timedef A():    while True:        print("----A---")        yield        time.sleep(0.5)def B(c):    while True:        print("----B---")        c.next()        time.sleep(0.5)if __name__=='__main__':    a = A()    B(a)

 

 

4.协程-greenlet版:开发者可以控制那个协程执行

为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变的更加简单

 

安装方式

使用如下命令安装greenlet模块:

sudo pip install greenlet
#coding=utf-8from greenlet import greenletimport timedef test1():    while True:        print "---A--"        gr2.switch()        time.sleep(0.5)def test2():    while True:        print "---B--"        gr1.switch()        time.sleep(0.5)gr1 = greenlet(test1)gr2 = greenlet(test2)#切换到gr1中运行gr1.switch()

 

    

5.gevent:自动切换协程

greenlet已经实现了协程,但是这个还的人工切换,是不是觉得太麻烦了,不要捉急,python还有一个比greenlet更强大的并且能够自动切换任务的模块gevent

#coding=utf-8#请使用python 2 来执行此程序import geventdef f(n):    for i in range(n):        print gevent.getcurrent(), ig1 = gevent.spawn(f, 5)g2 = gevent.spawn(f, 5)g3 = gevent.spawn(f, 5)g1.join()g2.join()g3.join()

  可以看到,3个greenlet是依次运行而不是交替运行

 

 

  2) gevent切换执行

import geventdef f(n):    for i in range(n):        print gevent.getcurrent(), i        #用来模拟一个耗时操作,注意不是time模块中的sleep        gevent.sleep(1)g1 = gevent.spawn(f, 5)g2 = gevent.spawn(f, 5)g3 = gevent.spawn(f, 5)g1.join()g2.join()g3.join()

 

 

 

6.gevent版-TCP服务器

import sysimport timeimport geventfrom gevent import socket,monkeymonkey.patch_all()def handle_request(conn):    while True:        data = conn.recv(1024)  #阻塞,切换        if not data:            conn.close()            break        print("recv:", data)        conn.send(data)def server(port):    s = socket.socket()    s.bind(('', port))    s.listen(5)    while True:        cli, addr = s.accept()   #阻塞,切换        gevent.spawn(handle_request, cli)if __name__ == '__main__':    server(7788)

 

转载于:https://www.cnblogs.com/venicid/p/8025321.html

你可能感兴趣的文章
数据库基础-数据库常用命令总结
查看>>
java8 按对象属性值排序
查看>>
[转帖]nvidia nvlink互联与nvswitch介绍
查看>>
【转帖】国产x86处理器KX-6000发布
查看>>
04-js的运算符
查看>>
第三天 while循环 及其用法
查看>>
Delphi 10 seattle 去掉自带的代码连接线
查看>>
构建高并发高可用的电商平台架构实践(转)
查看>>
Geometry Imager Viewport Filter
查看>>
九度oj 题目1025:最大报销额
查看>>
数字及字符串
查看>>
【转载】OmniGraffle (二)基础绘图和模具
查看>>
一些提高开发效率的 Category
查看>>
拓扑排序基础题——排序
查看>>
转:iphone 申请证书
查看>>
Python就业方向
查看>>
一步步学习SPD2010--第二章节--处理SP网站(3)--创建网站层次架构
查看>>
TCP
查看>>
Excel常用函数大全
查看>>
团队-团队编程项目中国象棋-模块测试过程
查看>>