簡體   English   中英

Python Trio 設置十進制數的工人

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM