python(32):多进程(2) multiprocessing

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."
相关文章
相关标签/搜索