Python下對協程的處理

2021-08-28 10:05:37 字數 2363 閱讀 9100

所謂協程又稱為微執行緒,我們在程序在建立時, 需要耗費時間和cpu資源;在建立多執行緒時,也需要消耗時間和資源。利用多協程的執行過程中,始終只要乙個執行緒, 不存在建立執行緒和銷毀執行緒需要的時間; 也沒有執行緒切換的開銷, 任務需要開啟執行緒數越多, 協程的優勢越明顯;更不需要多執行緒的鎖機制(gil)。

import time

def producer(c):

c.__next__()

n = 0

while n <5:

n +=1

print("[生產者]生產資料: %s" %(n))

res = c.send(n)

print("[消費者的返回值為:%s" %(res))

def consumer():

r = "a"

while true:

# yield r ====> r如何獲取? print(c.__next__())

# n = yield r ==> c.send("任務1") ===> n = "任務1"

n = yield r

if not n:

return

print("[消費者]執行%s....." %(n))

time.sleep(1)

r = "200 ok"

# 函式中有yield, 返回值為生成器;

c = consumer()

print(c.__next__())

print(c.send("任務1"))

# 由於切換是在io操作時自動完成, 所以gevent需要修改python自帶的一些標準庫;# gevent提供了patch_*來對於標準庫作修改;

import gevent

import time

from gevent import monkey

monkey.patch_all()

def job(n):

for i in range(n):

print(gevent.getcurrent(), n)

time.sleep(0.5)

def main1():

# 建立三個協程, 並讓該協程執行job任務

# 假設多協程執行的任務, 沒有io操作或者等待, 那麼協程間是依次執行, 而不是交替執行;

# 假設多協程執行的任務, io操作或者等待, 那麼協程間是交替執行;

g1 = gevent.spawn(job, 1)

g2 = gevent.spawn(job, 2)

g3 = gevent.spawn(job, 3)

gevent.joinall([g1, g2, g3])

print("執行任務結束")

測試**:

import time

from urllib.request import urlopen

from concurrent.futures import threadpoolexecutor

import gevent

from gevent import monkey

from 多程序與多執行緒._timeit import mytime

monkey.patch_all()

def load_url(url):

with urlopen(url) as conn:

data = conn.read()

print("%s網頁位元組數為%s" % (url, len(data)))

urls = ['', ''] * 1000

@mytime

def gevent_main():

gevents = [gevent.spawn(load_url, url) for url in urls]

gevent.joinall(gevents)

@mytime

def thread_main():

with threadpoolexecutor(max_workers=100) as f:

f.map(load_url, urls)

if __name__ == "__main__":

gevent_main()

thread_main()

python協程使用 協程的案例

概念 使用者層面在乙個執行緒中進行多工切換的機制,比執行緒更加輕量級 實現併發量更大 協程的使用 使用第三方庫 gevent gevent 是乙個基於協程的 python 網路庫,在遇到 io 阻塞時,程式會自動進行切換,可以讓我們用同步的放肆寫非同步 io 協程的使用 from gevent im...

對協程的理解

對於作業系統來說,協程其實是一種特殊的執行緒,對於cpu來說,協程是非搶占式 程序和執行緒是搶占式的 實現機理如下 有兩個function a,b,a呼叫b,b要執行一段時間,很晚才返回,a不會因為等b而一直占用cpu,即a是非阻塞的。b返回後,a又能繼續執行。神奇的是,a和b又是走在一條獨木橋 橋...

對協程的理解

實現併發,可以使用多程序,多執行緒。程序和執行緒有個共同點,他們都是通過作業系統來排程的。而協程,則把排程的權力交給了程式設計師。協程可以看作使用者態下協作的執行緒。使用者態 是說協程的排程權屬於程式設計師。協作 是說協程的排程是協作式的,不是搶占的。在協程中,某部分可以通過呼叫某個方法,將控制權交...