![](/img/trans.png)
[英]What is wrong with my code? I am a newbie and I don't know why it isn't working. (Python)
[英]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,因此它實際上應該僅返回80
和443
。
編輯:如果我使用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.