真匿名打脸爱好者 2018-02-08
1,如何实现在两个函数之间的切换?
def func1():
print(l)
yield
print(3)
yield
def func2():
g =func1()
next(g)
print(2)
next(g)
print(4)
func2()2,协程
import time
from greenlet import greenlet # 在单线程中切换状态的模块
def eat1():
print('吃鸡腿1')
g2.switch()
time.sleep(5)
print('吃鸡翅2')
g2.switch()
def eat2():
print('吃饺子1')
g1.switch()
time.sleep(3)
print('白切鸡')
g1 = greenlet(eat1)
g2 = greenlet(eat2)
g1.switch()3,gevent
from gevent import monkey;monkey.patch_all()
import time # time socket urllib requests
import gevent # greenlet gevent在切换程序的基础上又实现了规避IO
from threading import current_thread
def func1():
print(current_thread().name)
print(123)
time.sleep(1)
print(456)
def func2():
print(current_thread().name) # dummythread
print('hahaha')
time.sleep(1)
print('10jq')
g1 = gevent.spawn(func1) # 遇见他认识的io会自动切换的模块
g2 = gevent.spawn(func2)
gevent.joinall([g1,g2])4,效率对比
from gevent import monkey;monkey.patch_all()
import time # time socket urllib requests
import gevent # greenlet gevent在切换程序的基础上又实现了规避IO
def task(args):
time.sleep(1)
print(args)
def sync_func(): # 同步
for i in range(10):
task(i)
def async_func(): # 异步
g_l = []
for i in range(10):
g_l.append(gevent.spawn(task,i)) # 给写成任务传参数
gevent.joinall(g_l)
start = time.time()
sync_func()
print(time.time() - start)
start = time.time()
async_func()
print(time.time() - start)