Python多进程操作

2015-12-01 summer 更多博文 » 博客 » GitHub »

python

原文链接 http://fee.im/2015/12/python-mutilprocess/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


python中的多线程其实并不是真正的多线程,如果想充分利用多核CPU的资源,在python中大部分情况需要适用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiprocessing支持子进程、通信和共享数据、执行不同的形式的同步,提供了Process、Queue、Pipe、Lock等组件。

单进程

from multiprocessing import Process
import os

# 子进程要执行的代码
def run_proc(name):
    print 'Run child process %s (%s)...' % (name, os.getpid())

if __name__=='__main__':
    print 'Parent process %s.' % os.getpid()
    p = Process(target=run_proc, args=('test',))
    print 'Process will start.'
    p.start()
    p.join()
    print 'Process end.'

进程池


from multiprocessing import Pool
import os,time,random

def long_time_task(name):
    print 'Run task %s (%s)...' %(name,os.getpid())
    start = time.time()
    time.sleep(random.random()*3)
    end = time.time()
    print 'Task %s runs %0.2f seconds.' %(name,(end-start))

if __name__ == '__main__':
    print 'Parent process %s.' % os.getpid()
    p = Pool()
    for i in range(5):
        p.apply_async(long_time_task,args=(i,))
    print 'Waiting for all subprocesses done...'
    p.close()
    p.join()
    print 'All subprocesses done.'

注意:p = Pool()默认可同时执行的进程数量是按照机器的cpu来分配的,同时我们可以指定p=Pool(4)

封装成类

import multiprocessing
import time

class ClockProcess(multiprocessing.Process):
    def __init__(self, interval):
        multiprocessing.Process.__init__(self)
        self.interval = interval

    def run(self):
        n = 5
        while n > 0:
            print("the time is {0}".format(time.ctime()))
            time.sleep(self.interval)
            n -= 1

if __name__ == '__main__':
    p = ClockProcess(3)
    p.start()

关于daemon使用

不使用daemon

import multiprocessing
import time

def worker(interval):
    print("work start:{0}".format(time.ctime()));
    time.sleep(interval)
    print("work end:{0}".format(time.ctime()));

if __name__ == '__main__':
    p = multiprocessing.Process(target = worker, args = (3,))
    p.start()
    print "end!"

输出结果是:

end!
work start:Thu Dec  3 18:47:39 2015
work end:Thu Dec  3 18:47:42 2015

使用daemon

import multiprocessing
import time

def worker(interval):
    print("work start:{0}".format(time.ctime()));
    time.sleep(interval)
    print("work end:{0}".format(time.ctime()));

if __name__ == '__main__':
    p = multiprocessing.Process(target = worker, args = (3,))
    p.daemon = True
    p.start()
    print "end!"

输出结果是:

end!