我一直试图让我的头脑绕过多处理。问题是我遇到的所有例子似乎都不符合我的情况。我想进行涉及从参数中共享列表的多进程或线程工作,现在我当然不希望上述列表中的项目被处理两次,因此需要将工作分成每个新线程/进程(或跨进程)。
对于我应该关注的方法的任何建议都将不胜感激。
我知道下面的代码无论如何都是不正确的,只是为了帮助我想要尝试解释的内容。
SUDO
def work_do(ip_list)
for ip in list
ping -c 4 ip
def mp_handler(ip_range):
p = multiprocessing.Pool(4)
p.map(work_do, args=(ip_range))
ip_list = [192.168.1.1-192.168.1.254]
mp_handler(ip_list)
已编辑:
一些工作代码
import multiprocessing
import subprocess
def job(ip_range):
p = subprocess.check_output(["ping", "-c", "4", ip])
print p
def mp_handler(ip_range):
p = multiprocessing.Pool(2)
p.map(job, ip_list)
ip_list = ("192.168.1.74", "192.168.1.254")
for ip in ip_list:
mp_handler(ip)
如果您运行上述代码,您会注意到两个IP都运行了两次。如何管理流程以仅处理列表中的唯一数据?
答案 0 :(得分:1)
您目前正在做的事情应该没有问题,但如果您想手动创建流程,然后再加入它们:
import subprocess
import multiprocessing as mp
# Creating our target function here
def do_work(args):
# dummy function
p = subprocess.check_output(["ping", "-c", "4", ip])
print(p)
# Your ip list
ip_list = ['8.8.8.8', '8.8.4.4']
procs = [] # Will contain references to our processes
for ip in ip_list:
# Creating a new process
p = mp.Process(target=do_work, args=(ip,))
# Appending to procs
procs.append(p)
# starting process
p.start()
# Waiting for other processes to join
for p in procs:
p.join()
答案 1 :(得分:1)
使用multiprocessing
:
#!/usr/bin/env python
from multiprocessing.pool import ThreadPool # use threads
from subprocess import check_output
def ping(ip, timeout=10):
cmd = "ping -c4 -n -w {timeout} {ip}".format(**vars())
try:
result = check_output(cmd.split())
except Exception as e:
return ip, None, str(e)
else:
return ip, result, None
pool = ThreadPool(100) # no more than 100 pings at any single time
for ip, result, error in pool.imap_unordered(ping, ip_list):
if error is None: # no error
print(ip) # print ips that have returned 4 packets in timeout seconds
注意:我在这里使用ThreadPool
作为限制并发ping数量的便捷方式。如果您想一次完成所有ping操作,那么您既不需要线程也不需要多处理模块,因为每个ping都已经在它自己的进程中。请参阅Multiple ping script in Python。