Python greenlet和gevent使用代码示例解析
greenlet示例
greenlet微线程,允许在线程中手动切换
示例1,线程切换
from greenlet import greenletdef test1(x,y): z = gr2.switch(x+y) print(z)def test2(u): print(u) gr1.switch(42)gr1 = greenlet(test1)gr2 = greenlet(test2)gr1.switch('hello',’world’)
gr1和gr2是两个greenlet线程,使用gr1.switch(..)启动gr1,gr1执行test1,切换到gr2,gr2执行test2打印helloworld,然后切换回gr1,z获取
到返回值42,并打印.
执行顺序为:
gr1.switch('hello',’world’) -> test1(’hello’,’world’)->
gr2.switch(’helloword’)->test2(’helloworld’)->print(’helloworld’)
->gr1.switch(42)->z=42->print(42)
打印结果:
helloworld42
示例2
from greenlet import greenletdef eat(name): print(’%s eat 1’ %name) g2.switch(’egon’) print(’%s eat 2’ %name) g2.switch()def play(name): print(’%s play 1’ %name) g1.switch() print(’%s play 2’ %name)g1=greenlet(eat)g2=greenlet(play)g1.switch(’egon’)#可以在第一次switch时传入参数,以后都不需要
g1.switch(’egon’)#可以在第一次switch时传入参数,以后都不需要
gevent
gevent基于greenlet,遇到IO操作自动切换,IO操作比如网络请求,或使用 gevent.sleep(0)强制切换.
示例1
import geventdef func1(): print('start func1') gevent.sleep(1) print('end func1')def func2(): print('start func2') gevent.sleep(1) print('end func2')gevent.joinall( [ gevent.spawn(func1), gevent.spawn(func2) ])
执行结果:
start func1start func2end func1end func2``
示例2: gevent使用monkey对所有系统自带的IO操作打patch
```pythonfrom gevent import monkey;monkey.patch_all()import geventimport timedef eat(): print(’eat food 1’) time.sleep(2) # 会自动的跳转到play print(’eat food 2’)def play(): print(’play 1’) time.sleep(1) # 会自动的跳转到eat print(’play 2’)g1=gevent.spawn(eat)g2=gevent.spawn(play)gevent.joinall([g1,g2])print(’end’)
执行结果
eat food 1play 1play 2eat food 2end
示例3,发送请求
from gevent import monkey; monkey.patch_all()import geventimport requestsdef f(url): print(’GET: %s’ % url) resp = requests.get(url) data = resp.text print(’%d bytes received from %s.’ % (len(data), url))gevent.joinall([ gevent.spawn(f, ’https://www.python.org/’), gevent.spawn(f, ’https://www.yahoo.com/’), gevent.spawn(f, ’https://github.com/’), gevent.spawn(f, ’https://github.com/’), gevent.spawn(f, ’https://github.com/’), gevent.spawn(f, ’https://github.com/’), gevent.spawn(f, ’https://github.com/’),])
示例4:使用gevent的socket替代系统的socket
import geventfrom gevent import socketurls = [’www.baidu.com’, ’www.163.com’, ’www.qq.com’]jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]gevent.joinall(jobs, timeout=2)print([job.value for job in jobs])或使用patch_socket()from gevent import monkey; monkey.patch_socket()import geventdef f(n): for i in range(n): print(gevent.getcurrent(), i) gevent.sleep(0) # 不加的话不会交替执行g1 = gevent.spawn(f, 5)g2 = gevent.spawn(f, 5)g3 = gevent.spawn(f, 5)g1.join()g2.join()g3.join()
示例5:队列中使用gevent.sleet(0)强制切换到其他线程
import geventfrom gevent.queue import Queuedef func(): for i in range(10): print('int the func') q.put(f'test{i}') gevent.sleep(0)def func2(): for i in range(10): print('int the func2') res = q.get() print('--->',res)q = Queue()gevent.joinall( [ gevent.spawn(func2), gevent.spawn(func), ])
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持好吧啦网。
相关文章: