#!/usr/bin/env python # -*- coding: utf-8 -*- ''' @author: Heysion Yuan @copyright: 2019 By Heysion.Yuan @license: GPL v3.0 ''' from multiprocessing.pool import Pool import subprocess import Queue as queue import datetime import time import os import random def DEBUG(off=True): if off: import pdb;pdb.set_trace() else: pass def worker(taskid): def _run(cmd): output = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, universal_newlines=True, stderr=subprocess.STDOUT) if output.returncode is not 0: return (False,output.communicate()[0]) else: return (True,output.communicate()[0]) # error_mask = random.randint(1,(taskid%5)) # if taskid%10 > error_mask : # cmd = ["echo %d"%taskid] # else: cmd = ["ls alksdfjalkdsfadsfk"] ret = _run(cmd) print("{p} task#{idex} result:{ret} ".format(idex=taskid, p=os.getpid(),ret=ret)) return (ret[0],os.getpid()) pass def runner(): work_queue = queue.Queue() for w in range(10): work_queue.put(w) pool = Pool(processes=4) startTime = datetime.datetime.now() work_result_list = [] while True: if not work_queue.empty(): workee = work_queue.get() if workee is None: break work_result_list.append(pool.apply_async(worker,(workee,))) work_queue.task_done() else: break time.sleep(1) pool.close() pool.join() #DEBUG(True) time.sleep(5) for index, value in enumerate(work_result_list, 0): rc_orig = value.get() if rc_orig: rc,pid = rc_orig print("{p} task#{idex} result:{r}".format(idex=index, r=rc, p=pid )) else: print("task#{idex}".format(idex=index)) pass print(datetime.datetime.now() - startTime) if __name__ == "__main__": runner()