簡體   English   中英

我不確定為什么多處理隊列無法正常工作。 到底在做什么

[英]I am not sure why multiprocessing Queue isn't working. What is it doing?

我正在使用python的內置套接字和多處理庫來掃描主機的tcp端口。 我知道我的第一個功能可以正常工作,而我只是想使其與multriprocess Queue and Process一起使用,不確定我要去哪里。

如果刪除Queue似乎一切都完成了,那么我實際上實際上需要從中獲取結果。

from multiprocessing import Process, Queue
import socket

def tcp_connect(ip, port_number):
    try:
        scanner = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        scanner.settimeout(0.1)
        scanner.connect((str(ip), port_number))
        scanner.close()

        #put into queue
        ## Remove line below if you 
        q.put(port_number)
    except:
        pass

RESULTS = []
list_of_numbs = list(range(1,501))

for numb in list_of_numbs:

    #make my queue
    q = Queue()
    p = Process(target=tcp_connect, args=('google',numb))
    p.start()
    #take my results from my queue and append to a list
    RESULTS.append(q.get())
    p.join()

print(RESULTS)

我只想打印出打開的端口號。 現在,由於它正在掃描google.com,因此它實際上應該僅返回80443

編輯:如果我使用Pool的話這將起作用,但是我去了Process and Queue,因為其中更大的部分在celery中運行在Django中,並且在使用Pool執行時不允許守護進程

對於這樣的工作,使用multiprocessing.Pool將是處理它的更好方法。

您不必擔心創建流程和隊列。 所有這些都在后台為您完成。 您的worker函數只需要返回一個結果,該結果將為您傳輸到父進程。

我建議使用multiprocessing.Pool.imap_unordered() ,因為一旦可用,它就會開始返回結果。

一樣東西; 工作進程僅接受一個參數。 每個調用都需要多個不同的參數。 將它們包裹在一個元組中。 如果所有調用的參數都相同,請使用functools.partial


稍微更現代的形式給出了將使用Executor.map()方法從concurrent.futures 我認為,由於您的工作主要包括套接字調用,因此您可以在此處使用ThreadPoolExecutor 這應該比ProcessPoolExecutor少一些資源。

暫無
暫無

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

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