![](/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.