Python協程

今天給你們介紹一下協程。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('http://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)

前面有講到進程、線程,今天又講到了協程,那麼該怎麼結合使用呢app

from threading import Thread
from multiprocessing import Process, Queue import gevent import requests def work(): q = Queue() for i in range(10000): q.put('http://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()
相關文章
相關標籤/搜索