python(32):多进程(2) multiprocessing
python 多线程:多线程
由于Python设计的限制(我说的是咱们常用的CPython)。最多只能用满1个CPU核心。
Python提供了非常好用的多进程包multiprocessing,你只需要定义一个函数,Python会替你完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。
1、新建单一进程
如果我们新建少量进程,可以如下:
import multiprocessing import time def func(msg): for i in xrange(3): print msg time.sleep(1) if __name__ == "__main__": p = multiprocessing.Process(target=func, args=("hello", )) p.start() p.join() print "Sub-process done."
2、使用进程池
是的,你没有看错,不是线程池。它可以让你跑满多核CPU,而且使用方法非常简单。
注意要用apply_async,如果落下async,就变成阻塞版本了。
processes=10是最多并发进程数量。代码如下,能同时看到10个文件在同时进行写入。
# /usr/bin/env python # coding=utf8 import multiprocessing import time path = "C:\\Users\\admin.95BNQ4GMHNOZBFR\\Desktop\\linshi\\test\\" num = 0 def func(msg,k): print msg # for i in xrange(3): for j in range(5000): ff = open(path + str(k) + ".txt","a") ff.write("mmmmm" + "\n") ff.close() # time.sleep() if __name__ == "__main__": pool = multiprocessing.Pool(processes=10) #同时跑十个进程 for i in xrange(100): #先把这100个跑完,然后每次跑其中的十个 msg = "hello %d" % (i) print msg + "---" pool.apply_async(func, (msg,i)) pool.close() pool.join() print "Sub-process done."
运行结果:可以看出把100个任务送进进程池中,然后每次从中取10个
3、使用Pool,并需要关注结果
更多的时候,我们不仅需要多进程执行,还需要关注每个进程的执行结果,如下:
# /usr/bin/env python # coding=utf8 import multiprocessing import time path = "C:\\Users\\admin.95BNQ4GMHNOZBFR\\Desktop\\linshi\\test\\" num = 0 def func(msg, k): print "||" + msg # for i in xrange(3): for j in range(3000): ff = open(path + str(k) + ".txt", "a") ff.write("mmmmm" + "\n") ff.close() return "the " + str(k) + " have done" # 返回已经完成的状态 if __name__ == "__main__": pool = multiprocessing.Pool(processes=4) # 同时跑十个进程 result = [] for i in xrange(10): # 先把这100个跑完,然后每次跑其中的十个 msg = "hello %d" % (i) print msg + "---" result.append( pool.apply_async(func, (msg, i))) pool.close() pool.join() for res in result: #进程池中的任务结束后,输出完成的状态 print res.get() print "Sub-process done."
如果不是 append,直接输出的话:
from multiprocessing import Process,Pool import time import random import multiprocessing def info(name): print(f"Process-{name} info stats....\n",end='') time.sleep(random.randrange(1,2)) print(f"Process-{name} info ends....\n",end='') if __name__ == "__main__": pool = multiprocessing.Pool(processes=2) #同时跑2个进程 result=[] for i in range(10): pool.apply_async(func=info, args=(i,)) pool.close() pool.join() print("主进程") for res in result: print(res.get())