python(32):多进程 multiprocessing

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python(32):多进程 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."

 

 

 


以上是关于python(32):多进程 multiprocessing的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫提速小技巧,多线程与多进程(附源码示例)

python 进程池的使用

python并发之multiprocessing

准确确定在 Python 多处理期间腌制的内容

使用 Python 多处理进行通信的 OSX 和 Linux 之间的性能差异

python 对mongodb进行压力测试