我目前有一個生成器的形式的代碼調用一個IO綁定的任務。發電機實際上也會調用子發電機,所以我們將會讚賞更通用的解決方案。我應該在這裏使用協程或其他調度對象嗎?
類似以下內容:
def processed_values(list_of_io_tasks):
for task in list_of_io_tasks:
value = slow_io_call(task)
yield postprocess(value) # in real version, would iterate over
# processed_values2(value) here
我有完全的控制權slow_io_call
,我不在乎以什麼順序我從processed_values
的項目。有沒有類似於協程的東西,我可以通過將slow_io_call
轉換爲異步函數並使用哪個調用返回最快來獲得最快順序的結果?我預計list_of_io_tasks
至少有數千個條目。除了顯式線程外,我從來沒有做過任何並行的工作,特別是我從來沒有使用可用的各種形式的輕量線程。
我需要使用標準的CPython實現,並且我正在Linux上運行。
啊,問題僅僅是slow_io_call被外包給外面蟒蛇,可能需要一段時間才能恢復 - 添加儘可能多的儘可能進入slow_io_call的實例會更好,因爲我可以發出儘可能多的同時請求(例如:查詢分佈式客戶端的信息,結合硬盤寫入,請求數量不會顯着影響響應任何請求的時間)。雖然沒有記錄,但我假設一個進程池最多進入迭代器4次,然後進行比賽,而不是暫停並進入下一個迭代步驟? – 2011-04-19 00:43:36
嘗試增加池大小並比較進程與線程池,以便爲您的應用程序找到最佳解決方案,這總是相對加速和開銷增加之間的平衡。 – Garrett 2011-04-19 03:01:50