协程
协程实现多任务的几种方式(需要使用的协程解决问题的时候,建议用 gevent)
1. yield
import time
def task1():
print("---1---")
time.sleep(0.1)
yield
def task2():
print("---2---")
time.sleep(0.1)
yield
def main():
t1 = task1()
t2 = task2()
while True:
next(t1)
next(t2)
if __name__ == "__main__":
main()
2. greenlet
from greenlet import greenlet
import time
def test1():
while True:
print("---A---")
gr2.switch()
time.sleep(0.1)
def test2():
while True:
print("---B---")
gr1.switch()
time.sleep(0.1)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
3. gevent
第一种方式:
import gevent
# gevnet 中所有和时间有关的方法都不能使用普通的, 如需要将 time.sleep() 换成 gevent.sleep()
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)
print("---0---")
g1 = gevent.spawn(f1, 5)
print("---1---")
g2 = gevent.spawn(f2, 5)
print("---2---")
g3 = gevent.spawn(f3, 5)
print("---3---")
g1.join()
g2.join()
g3.join()
第二种方式:
import gevent
import time
from gevent import monkey
# 默认情况下,使用time.sleep()并不能达到真正的多任务,而是需要使用gevent.sleep()
# 但是这样可能会太麻烦,所以可以使用 monkey.patch_all() 这样就会自动在执行时将
# time.sleep() 转换为 gevent.sleep()
monkey.patch_all()
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)
print("---0---")
g1 = gevent.spawn(f1, 5)
print("---1---")
g2 = gevent.spawn(f2, 5)
print("---2---")
g3 = gevent.spawn(f3, 5)
print("---3---")
g1.join()
g2.join()
g3.join()
第三种方式:
import gevent
from gevent import monkey
import time
monkey.patch_all()
def f(n):
for i in range(10):
print(gevent.getcurrent(), i)
time.sleep(0.5)
gevent.joinall([
gevent.spawn(f, "work1"),
gevent.spawn(f, "work2"),
gevent.spawn(f, "work3"),
])
浙公网安备 33010602011771号