Python協程
- 2020 年 5 月 11 日
- 筆記
- Python測試開發
今天給大家介紹一下協程。
協程存在於執行緒之中,執行緒默認不會等待協程執行
協程使用的庫是gevent
spawn:開啟協程(第一個參數為協程要執行的任務)
join: 讓執行緒等待協程執行
協程之間切換的條件:gevent.sleep() 協程耗時等待的情況下才會切換
協程只能並發不能做並行
import gevent from gevent import monkey import time a = monkey.patch_all() def work_1(): for i in range(10): print("work1---{}".format(i)) # gevent.sleep(1) # 協程耗時等待的情況下才會切換 time.sleep(0.1) # gevent 的程式修補程式 只要程式碼中有耗時的操作就會進行一個切換 monkey.patch_all() def work_2(): for i in range(10): print("work2---{}".format(i)) # gevent.sleep(1) # 協程耗時等待的情況下才會切換 time.sleep(0.1) monkey.patch_all() # 創建兩個協程 g1 = gevent.spawn(work_1) g2 = gevent.spawn(work_2) g1.join() # 讓執行緒等待協程執行 g2.join() # 讓執行緒等待協程執行
下面附上一段程式碼,使用協程訪問一個網站,利用隊列加入訪問的url地址,使用協程取出並訪問
import requests
import gevent
from gevent import monkey
import queue
import time
count = 0
q = queue.Queue()
for i in range(1000):
q.put('//localhost:3000/login')
def get():
global count
while q.qsize() > 0:
requests.get(url=q.get())
if q.qsize() == 0:
break
monkey.patch_all()
# count += 1
# print(count)
s = time.time()
g1 = gevent.spawn(get)
g2 = gevent.spawn(get)
g1.join()
g2.join()
e = time.time()
print(e - s)
前面有講到進程、執行緒,今天又講到了協程,那麼該怎麼結合使用呢
from threading import Thread
from multiprocessing import Process, Queue
import gevent
import requests
def work():
q = Queue()
for i in range(10000):
q.put('//localhost:3000/')
print('{}個任務'.format(q.qsize()))
pro_list = []
for i in range(2):
# 創建2個進程 進程的工作函數process_work
p = Process(target=process_work, args=(q,))
p.start()
pro_list.append(p)
for p in pro_list:
p.join()
def process_work(q):
'''
:paran: q:進程中通訊的任務隊列
'''
thread_list = []
# 在每一個進程中創建3個執行緒
for i in range(3):
# 執行緒的工作函數 thread_work
t = Thread(target=thread_work, args=(q,))
thread_list.append(t)
t.start()
for t in thread_list:
t.join()
def thread_work(q):
g_list = []
# 在每一個執行緒中創建5個協程
for i in range(5):
t = gevent.spawn(green_work, q, )
g_list.append(t)
gevent.joinall(g_list)
def green_work(q):
count = 0
# 判斷隊列內是否有值
while not q.empty():
# 設置超時等待時間
requests.get(url=q.get(0.01))
# 設置強制等待切換協程
gevent.sleep(0.001)
count += 1
print('協程執行了{}個任務'.format(count))
if __name__ == '__main__':
work()