2014-10-12 109 views
0

我一直在試圖讓我的頭多處理。問題是我遇到的所有例子都不符合我的情況。我想要多進程或線程工作,涉及從參數共享列表,現在當然我不希望從上述列表中的項目被兩次處理,因此需要將工作劃分到每個新的線程/進程(或跨進程)。多處理建議

任何意見,我應該看的方法將不勝感激。

我知道我的代碼在任何方面都是不正確的,它只是幫助形象化我試圖解釋的東西。

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的被運行兩次。我如何管理流程以僅處理列表中的唯一數據?

回答

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() 
+0

感謝您的回覆@Games Brainiac,我測試了上面的代碼,它看起來很完美。然而,將它實現到我自己的代碼似乎工作,直到仔細檢查表明,查詢對IP的響應以不同的IP返回。 IE的數據似乎混在一起,請求和響應無關, – iNoob 2014-10-12 01:11:43

+0

@iNoob您需要修改'do_work'函數來打印結果的元組,而不是僅僅打印到控制檯。我向你展示的是一個你可以建立的簡單例子。 – 2014-10-12 03:51:12

+0

@iNoob:你不應該在沒有鎖的情況下從多個進程中打印。爲了避免混合輸出;您可以將結果報告移到主流程中,如我的答案。如果你想要的只是一個狀態,那麼在這裏沒有必要使用'mp.Process()'。 'ping'已經是一個單獨的過程,參見[我在答案中提供的鏈接](http://stackoverflow.com/a/12102040/4279)。 – jfs 2014-10-12 04:08:27

1

要ping多個IP地址,同時使用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

+0

我認爲apply_async在這種情況下會更好。 – 2014-10-12 03:49:58

+0

@GamesBrainiac:我不這麼認爲 – jfs 2014-10-12 03:50:32