python 多线程:多线程html
因为Python设计的限制(我说的是我们经常使用的CPython)。最多只能用满1个CPU核心。
Python提供了很是好用的多进程包multiprocessing,你只须要定义一个函数,Python会替你完成其余全部事情。借助这个包,能够轻松完成从单进程到并发执行的转换。python
一、新建单一进程多线程
若是咱们新建少许进程,能够以下:并发
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."
二、使用进程池app
是的,你没有看错,不是线程池。它可让你跑满多核CPU,并且使用方法很是简单。async
注意要用apply_async,若是落下async,就变成阻塞版本了。函数
processes=10是最多并发进程数量。代码以下,能同时看到10个文件在同时进行写入。spa
# /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个线程
三、使用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."