簡體   English   中英

將多處理隊列的結果存儲在 python 中

[英]Store the results of a multiprocessing queue in python

我正在嘗試使用多處理隊列存儲多個 API 請求的結果,因為 API 一次無法處理超過 5 個連接。

我找到了如何將多處理與請求模塊一起使用的解決方案的一部分?

def worker(input_queue, stop_event):
    while not stop_event.is_set():
        try:
            # Check if any request has arrived in the input queue. If not,
            # loop back and try again.
            request = input_queue.get(True, 1)
            input_queue.task_done()
        except queue.Empty:
            continue
        print('Started working on:', request)
        api_request_function(request) #make request using a function I wrote

        print('Stopped working on:', request)


def master(api_requests):
    input_queue = multiprocessing.JoinableQueue()
    stop_event = multiprocessing.Event()
    workers = []
    # Create workers.
    for i in range(3):
        p = multiprocessing.Process(target=worker,
                                    args=(input_queue, stop_event))
        workers.append(p)
        p.start()

    # Distribute work.
    for requests in api_requests:
        input_queue.put(requests)

    # Wait for the queue to be consumed.
    input_queue.join()
    # Ask the workers to quit.
    stop_event.set()

    # Wait for workers to quit.
    for w in workers:
        w.join()

    print('Done')

我查看了線程和池的文檔,但缺少一個步驟。 所以上面的運行並且所有的請求都會得到一個 200 狀態碼,這很棒。 但是我存儲請求的結果要使用嗎?

謝謝你的幫助山

我相信你必須做一個隊列。 代碼可能有點棘手,您需要閱讀多處理模塊。 通常,對於多處理,所有變量都會為每個工作人員復制,因此您不能執行諸如附加到全局變量之類的操作。 因為這將被復制,而原件將保持不變。 有一些函數已經自動合並了工作者、隊列和返回值。 就個人而言,我嘗試編寫我的函數來使用 mp.map,如下所示:

def worker(*args,**kargs):
    #do stuff
    return 'thing'
output = multiprocessing.Pool().map(worker,[1,2,3,4,5])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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