1.yield實現協程
def consumer(name):
print('開始吃包子...')
while True:
print('[consumer]%s需要包子'%name)
bone = yield #接收send發送的數據
print('[%s]吃了%s個包子'%(name, bone))
def producer(obj1):
obj1.send(None) #必須先發送None
for i in range(1,4):
print('[producer]正在做%s個包子'%i)
obj1.send(i)
if __name__ == '__main__':
conn = consumer("張三")
producer(conn)
conn.close()
2.gevent實現協程
def foo():
print('running in foo')
gevent.sleep(1)
print('com back from bar in to foo')
def bar():
print('running in bar')
gevent.sleep(1)
print('com back from foo in to bar')
if __name__ == '__main__':
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
3.線程函數同步與異步
def task(pid):
gevent.sleep(1)
print('task %s done'%pid)
def synchronous(): #同步一個線程執行函數
for i in range(1,10):
task(i)
def asynchronous(): #異步一個線程執行函數
threads = [gevent.spawn(task,i) for i in range(10)]
gevent.joinall(threads)
if __name__ == '__main__':
print('synchronous:')
synchronous() #同步執行時要等待執行完後再執行
print('asynchronous:')
asynchronous() #異步時遇到等待則會切換執行
4.爬蟲異步IO阻塞切換
from urllib import request
import gevent,time
from gevent import monkey
monkey.patch_all() #將程序中所有IO操作做上標記使程序非阻塞狀態
def url_request(url):
print('get:%s'%url)
resp = request.urlopen(url)
data = resp.read()
print('%s bytes received from %s'%(len(data),url))
if __name__ == '__main__':
async_time_start = time.time() #開始時間
gevent.joinall([
gevent.spawn(url_request,'https://www.python.org/'),
gevent.spawn(url_request,'https://www.nginx.org/'),
gevent.spawn(url_request,'https://www.ibm.com'),
])
print('haoshi:',time.time()-async_time_start) #總用時