您好,登錄后才能下訂單哦!
本篇內容介紹了“Gevent同步和異步怎么執行”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
gevent是一個基于libev的并發庫。它為各種并發和網絡相關的任務提供了整潔的API。
在gevent中用到的主要模式是Greenlet, 它是以C擴展模塊形式接入Python的輕量級協程。 Greenlet全部運行在主程序操作系統進程的內部,但它們被協作式地調度。
在任何時刻,只有一個協程在運行。
這與multiprocessing
或threading
等提供真正并行構造的庫是不同的。 這些庫輪轉使用操作系統調度的進程和線程,是真正的并行。
并發的核心思想在于,大的任務可以分解成一系列的子任務,后者可以被調度成 同時執行或異步執行,而不是一次一個地或者同步地執行。兩個子任務之間的 切換也就是上下文切換。
在gevent里面,上下文切換是通過yielding來完成的. 在下面的例子里, 我們有兩個上下文,通過調用gevent.sleep(0)
,它們各自yield向對方。
import gevent
def foo():
print('Running in foo')
gevent.sleep(0)
print('Explicit context switch to foo again')
def bar():
print('Explicit context to bar')
gevent.sleep(0)
print('Implicit context switch back to bar')
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
Running in foo Explicit context to bar Explicit context switch to foo again Implicit context switch back to bar
下圖將控制流形象化,就像在調試器中單步執行整個程序,以說明上下文切換如何發生。
當我們在受限于網絡或IO的函數中使用gevent,這些函數會被協作式的調度, gevent的真正能力會得到發揮。Gevent處理了所有的細節, 來保證你的網絡庫會在可能的時候,隱式交出greenlet上下文的執行權。 這樣的一種用法是如何強大,怎么強調都不為過。或者我們舉些例子來詳述。
“Gevent同步和異步怎么執行”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。