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())

 

 

 
posted on 2017-02-28 11:22  细雨微光  阅读(702)  评论(0编辑  收藏  举报