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()