0

該項目是實現自定義流二進制協議的Python 3庫(包)。認爲對流處理的類的:Python 3:當需要向用戶公開經典+ asyncio界面時,重用項目中代碼的最佳方式

MyEncodingWriter(dst_stream) - 轉換Python對象到原始字節流 MyDecodingReader(src_stream) - 將原始編碼的字節的消息或Python對象

我需要同時支持阻斷同步流和asyncio StreamReader + StreamWriter,(可能,從它們繼承)

我知道我不能直接使用coroutines作爲常規同步功能。

我想模仿ASYNCIO讀/寫器API在我的課MyEncodingWriter()MyDecodingReader()read(), readexactly(),...) ,所以唯一的差別將是額外的異步/在ASYNCIO版本等待的關鍵字。

這對我來說很奇怪,我將有兩個副本或回覆,代碼非常類似,我不能重複使用。

現在我只有這個想法... ...嘗試在元類的幫助下從異步動態生成同步代碼(通過剝離異步/等待關鍵字),也許呢?

它有一些更好的方法?

TYA對於這樣的雙重實現的任何建議或美麗的sampes /回購。

回答

0

使阻塞版本成爲異步版本的子類,幷包裝調用。沒測試過,可能有語法錯誤,但沿着這些線路:

class MyBlockingEncodingReader(MyEncodingReader): 
    def readexactly(self, n): 
     return asyncio.get_event_loop().run_until_complete(super().readexactly(n)) 
+0

謝謝,我認爲它會工作,但什麼是預期的開銷? 我認爲每個電話的換行都會增加一些%....你是否有任何估計這種開銷? – ppmag

+0

猜測百分比開銷並不是真的可能或有幫助。它高度依賴於很多事情(而I/O本身幾乎肯定會壓倒所有其他開銷)。你只能通過分析來回答這個問題。簡單地寫下來,看看你的性能問題在哪裏,然後優化它們。嘗試圍繞單個函數調用進行微優化只會導致代碼混淆,而沒有實際的好處。 (如果這段代碼被頻繁調用以至於會成爲瓶頸,那麼您可能想用C重寫這段代碼。) –

相關問題