pythonでのジェネレータの応用
2195 ワード
ジェネレータの適用:マルチタスクの実装
パラレル(本物):2つのタスク、2つのcpu、1つのタスクが1つのcpuを占める同時(偽):4つのタスク、2つのcpu、4つのタスクが交互にcpu実行を占有する
yieldは単一スレッドの同時実行を実現する
キーワードyieldを使用して一度に結果を返し、ブロックし、send起動を再開します.
グリーンレットを使用してマルチタスクを完了マルチタスクをよりよく使用するためにpythonのgreebletモジュールがパッケージpip 3 install greenlet""
同じgeventモジュールもあります
import time
def task_1():
while True:
print('-----1-------')
time.sleep(0.1)
yield
def task_2():
while True:
print('-------2---------')
time.sleep(0.1)
yield
# task_1()
# task_2()
def main():
t1 = task_1()
t2 = task_2()
"""
while True
t1 , t1 yield , 18
t2, yield , t1
t1/t2/t1/t2 , ---->
"""
while True:
next(t1)
next(t2)
main()
パラレル(本物):2つのタスク、2つのcpu、1つのタスクが1つのcpuを占める同時(偽):4つのタスク、2つのcpu、4つのタスクが交互にcpu実行を占有する
yieldは単一スレッドの同時実行を実現する
import time
def consumer(name):
print('%s ~' %(name))
while True:
lesson = yield
print(' [%s] ,[%s] ~' %(lesson,name))
def producer(name):
c1 = consumer('A')
c2 = consumer('B')
c1.__next__()
c2.__next__()
print(' ~')
for i in range(10):
time.sleep(1)
print(' ')
c1.send(i)
c2.send(i)
producer('westos')
キーワードyieldを使用して一度に結果を返し、ブロックし、send起動を再開します.
グリーンレットを使用してマルチタスクを完了マルチタスクをよりよく使用するためにpythonのgreebletモジュールがパッケージpip 3 install greenlet""
from greenlet import greenlet
import time
def test1():
while True:
print('---A----')
gr2.switch()
time.sleep(0.5)
def test2():
while True:
print('----B----')
gr1.switch()
time.sleep(0.5)
"""
greenlet yield
"""
gr1= greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
同じgeventモジュールもあります
import gevent
def f1(n):
for i in range(n):
print(gevent.getcurrent(),i)
gevent.sleep(0.5)
def f2(n):
for i in range(n):
print(gevent.getcurrent(),i)
gevent.sleep(0.5)
def f3(n):
for i in range(n):
print(gevent.getcurrent(),i)
#gevent.sleep(0.5)
g1 = gevent.spawn(f1,5)
g2 = gevent.spawn(f2,5)
g3 = gevent.spawn(f3,5)
g1.join()
g2.join()
g3.join()