多处理建议

时间:2014-10-12 00:13:24

标签: python multithreading multiprocessing

我一直试图让我的头脑绕过多处理。问题是我遇到的所有例子似乎都不符合我的情况。我想进行涉及从参数中共享列表的多进程或线程工作,现在我当然不希望上述列表中的项目被处理两次,因此需要将工作分成每个新线程/进程(或跨进程)。

对于我应该关注的方法的任何建议都将不胜感激。

我知道下面的代码无论如何都是不正确的,只是为了帮助我想要尝试解释的内容。

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都运行了两次。如何管理流程以仅处理列表中的唯一数据?

2 个答案:

答案 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

可以轻松地同时ping多个IP地址
#!/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