greenlet示例
greenlet微线程,允许在线程中手动切换
示例1,线程切换
from greenlet import greenlet def 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)
打印结果:
helloworld
42
示例2
from greenlet import greenlet def 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 gevent def 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 func1
start func2
end func1
end func2
``
示例2: gevent使用monkey对所有系统自带的IO操作打patch
```python from gevent import monkey;monkey.patch_all() import gevent import time def 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 1
play 1
play 2
eat food 2
end
示例3,发送请求
from gevent import monkey; monkey.patch_all() import gevent import requests def 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 gevent from gevent import socket urls = ['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 gevent def 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 gevent from gevent.queue import Queue def 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), ] )
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]