Python3之協程

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) #總用時

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章