python 非同步與協程學習

2021-08-15 12:25:29 字數 2684 閱讀 3881

參考:

深入理解python非同步程式設計

理解 python asyncio

(1)非同步非租塞

以春運火車票為例,

非同步—-你使用分流軟體搶票,設定好時間型別,軟體自動執行

非阻塞—-你不用等搶票結果,可以去做別的事

如何獲得結果:

輪詢—–每隔一段時間,你看一下搶到票沒有

事件通知—-設定搶到票,郵件或者簡訊通知

為什麼這麼做?

假如你是乙個黃牛,你可以通過這種方法搶到成千上萬的票,也就是提高併發量

(2)python中的非同步與協程

假如你是黃牛,

軟體自動執行之後,你要記住是這是哪個客戶的票—-儲存上下文

買到票後,你要去告訴相應的客戶,去支付費用——恢復上下文

python中對應的就是:

儲存協程狀態

生成器yield

恢復協程狀態

send

事件通知

linux系統提供的epoll

(1)註冊事件和儲存上下文

class

crawler:

def__init__

(self, url):

self.url = url

self.response = b''

deffetch

(self):

sock = socket.socket()

sock.setblocking(false)

try:

sock.connect(('example.com', 80))

except blockingioerror:

pass

f = future()

defon_connected

(): f.set_result(none)

selector.register(sock.fileno(), event_write, on_connected)

yield f #註冊事件和儲存上下文

chunk = yield f #註冊事件和儲存上下文

selector.unregister(sock.fileno())

if chunk:

self.response += chunk

else:

urls_todo.remove(self.url)

ifnot urls_todo:

stopped = true

break

(2)恢復協程狀態

class

future:

def__init__

(self):

self.result = none

self._callbacks =

defadd_done_callback

(self, fn):

defset_result

(self, result):

self.result = result

for fn in self._callbacks:

fn(self)

class

task:

def__init__

(self, coro):

self.coro = coro

f = future()

f.set_result(none)

self.step(f)

defstep

(self, future):

try:

# send會進入到coro執行, 即fetch, 直到下次yield

# next_future 為yield返回的物件

next_future = self.coro.send(future.result)#恢復狀態

except stopiteration:

return

next_future.add_done_callback(self.step)

(3)事件迴圈

def

loop

():while

not stopped:

# 阻塞, 直到乙個事件發生

events = selector.select()

for event_key, event_mask in events:

callback = event_key.data

callback()

python協程與非同步協程

在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...

http 協程與非同步 Python

協程是啥 簡單來說,協程是一種基於執行緒之上,但又比執行緒更加輕量級的存在。對於系統核心來說,協程具有不可見的特性,所以這種由 程式設計師自己寫程式來管理的輕量級執行緒又常被稱作 使用者空間執行緒 協程比多執行緒好在哪 適用場景 協程適用於被阻塞的,且需要大量併發的場景。不適用場景 協程不適用於存在...

關於python協程與非同步舉例

寫了幾個介面,也就接觸到了python的非同步。python的協程使用非同步實現的 說法不知道準不準確 所以直接使用協程來做,看的很多例子也是這麼幹的 先看 import json import tornado import tornado.web from tornado import gen f...