#coding: utf-8import multiprocessingimport timeimport osdef func(msg): print("msg: ", os.getpid()) time.sleep(3) print ("end")if __name__ == "__main__": pool = multiprocessing.Pool(processes = 3) for i in xrange(4): msg = ("hello %d" %(i)) pool.apply_async(func, (msg, )) #维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去 print "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~" pool.close() pool.join() #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束 print ("Sub-process(es) done.")
apply_async(func[, args[, kwds[, callback]]])
它是非阻塞,apply(func[, args[, kwds]])是阻塞的(理解区别,看例1例2结果区别)
执行说明:创建一个进程池pool,并设定进程的数量为3,xrange(4)会相继产生四个对象[0, 1, 2, 4],四个对象被提交到pool中,因pool指定进程数为3,所以0、1、2会直接送到进程中执行,当其中一个执行完事后才空出一个进程处理对象3,所以会出现输出“msg: hello 3”出现在"end"后。因为为非阻塞,主函数会自己执行自个的,不搭理进程的执行,所以运行完for循环后直接输出“mMsg: hark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~”,主程序在pool.join()处等待各个进程的结束。
创建函数并将其作为单个进程
import multiprocessing as MPimport osimport timedef worker(interval): n = 5 while n > 0: print("The time is {0}".format(time.ctime())) time.sleep(interval) n -= 1if __name__ == "__main__": p = MP.Process(target = worker, args = (3,)) p.start() # make it run print ("p.pid:", os.getpid())