![](/img/trans.png)
[英]Python Multiprocessing: How to set up the number of max_workers properly?
[英]Python Trio set up a decimal number of workers
我正在與 trio 合作運行異步並發任務,該任務將在不同的網站上進行一些網絡抓取。 我希望能夠選擇我將與多少並發工作人員一起分配任務。 為此,我編寫了這段代碼
async def run_task():
s = trio.Session(connections=5)
Total_to_check = to_check() / int(module().workers)
line = 0
if int(Total_to_check) < 1:
Total_to_check = 1
module().workers = int(to_check())
for i in range(int(Total_to_check)):
try:
async with trio.open_nursery() as nursery:
for x in range(int(module().workers)):
nursery.start_soon(python_worker, self, s, x, line)
line += 1
except BlockingIOError as e:
print("[Fatal Error]", str(e))
continue
在這個例子中, to_check()
等於提供了多少個 url 來從中獲取數據,而module().workers
等於我想要使用的並發工作人員的數量。
因此,如果我假設我有 30 個 url,並且我輸入我想要 10 個並發任務,它將同時從 10 個 url 中獲取數據並重復該過程 3 次。
現在這一切都很好,直到我的Total_to_check
(等於 url 的數量除以工作人員的數量)是小數。 如果我假設有 15 個 url 並且我要求 10 個工人,那么此代碼將只檢查 10 個 url。 如果我有 20 個網址,但要求 15 個工人,也一樣。 我可以做一些類似 math.ceil(Total_to_check) 的事情,但它會開始嘗試檢查不存在的 url。
我怎樣才能讓它正常工作,這樣如果我有 10 個並發任務和 15 個 url,它會同時檢查前 10 個,然后同時檢查最后 5 個而不跳過 url? (或試圖檢查太多)
謝謝!
好吧,這是您可以像這樣使用的CapacityLimiter :
async def python_worker(self, session, workers, line, limit):
async with limit:
...
然后你可以簡化你的run_task
:
async def run_task():
limit = trio.CapacityLimiter(10)
s = trio.Session(connections=5)
line = 0
async with trio.open_nursery() as nursery:
for x in range(int(to_check())):
nursery.start_soon(python_worker, self, s, x, line, limit)
line += 1
我相信BlockingIOError
也必須在python_worker
內部移動,因為nursery.start_soon()
不會阻塞,它是nursery
的__aexit__
在async with trio.open_nursery() as nursery
結束時自動等待, async with trio.open_nursery() as nursery
塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.