繁体   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