python如何实现多进程_Python中实现多进程

fork

Linux/Unix系统提供了一个非常特殊的函数fork().该函数在调用之后,调用它的进程会被复制一份,包括当前的RAM和接下来要执行的代码。

关于fork的具体内容可以阅读更多的文章:

http://blog.csdn.net/jason314...

http://blog.csdn.net/cywosp/a...

调用的fork()函数,它在主进程中返回的是子进程的pid;它在子进程中反馈的是0.

那么,我们就可以根据fork()函数返回的值来判断是在主进程中还是在子进程中了。

在Python中,为我们提供了os.fork()。

import os

print "Process (%s) is running" % os.getpid()

i = 100

pid = os.fork()

if pid == 0:

print "Son process (%s) is running" % os.getpid()

else:

print "Main process (%s) is running" % os.getpid()

上面的代码用到了几个函数,罗列如下:os.fork(),创建进程,在主进程中返回子进程的id,在子进程中返回0.

os.getpid() 获取到当前进程的id。

os.getppid() 获取当前进程父进程的id。

但是唯一遗憾的是,fork()函数只能在linuxunix系统中使用,不能在windows系统中使用。

multiprocessing

Python提供了跨平台的多进程支持,multiprocessing. multiprocessing模块提供了一个Process类代表一个进程。我们可以用Process创建一个进程。

from multiprocessing import Process

import time

def son_process(name):

time.sleep(2)

print "Process%sis running" % name

if __name__ == '__main__':

son_process = Process(target=son_process, args=('Son',))

print "Son process is started"

son_process.start()

son_process.join()

print "Son process is ended - Printed by Main Process"

上面主要用到了Process(target, attrs) 构造一个进程

process.start() 进程开始

process.join() 进程同步,Main进程序等待子程序完成后在执行后代码。

需要注意的是,在windows下,如果子进程序不是在__main__中创建的,那么就会出错。因为windows在创建子进程的时候,会将创建它的py文件import进去。import进去机会执行,那么就会不断地创建子进程,所以会出错。

因此在windows下,需要将其包含在__main__中。

Pool

上面的提到的Process主要用于创建一个进程,如何创建多个呢?Python在multiprocessing包里为我们提供了Pool类。

我们可以使用Pool.apply_async(func, args)函数来创建子进程。

代码:

from multiprocessing import Pool

import time

def son_process(name):

time.sleep(5)

print "Process%sis running\n" % name

pool = Pool(4)

print "Son process is started"

for x in range(0, 10):

pool.apply_async(son_process, args=('son_%d'%x,))

pool.close()

print "Mark"

pool.join()

print "Son process is ended - Printed by Main Process"Pool(4)

join()Wait for the worker processes to exit. One must call close() or terminate() before using join().即主进程会在.join()处等待worker进程们结束后再执行。

apply() 和 apply_async()

apply()和apply_async()的区别就是前者是阻塞式的,后者是非阻塞式的。

阻塞式意思就是需要等待子进程完成后才能执行主线程后续的内容。

非阻塞意思就是无需等待子进程,两者是同步进行的。

map() 和 map_async()

跟高阶函数map()一致,Pool的map()函数是将一个可迭代对象的每一个元素作用域func。

map也分阻塞和非阻塞。

imap() 和 imap_unordered()

imap 与 map的区别是,map是当所有的进程都已经执行完了,并将结果返回了,那么才返回map()函数的一个list结果。imap()则是立即返回一个iterable可迭代对象。其迭代随着进行返回的结果而逐步迭代。imap()和 imap_unordered()的区别

imap_unordered()不保证返回的结果顺序与进程添加的顺序一致。

怎么取得进程的结果?

阻塞式函数:

Pool.apply()直接返回结果

Pool.map() 直接返回一个list

非阻塞式函数

Pool.apply_async()和Pool.map_async() 返回一个AsyncResult对象。

AsyncResult对象具有:get()函数可以获取结果。

imap() imap_unordered()则是返回可迭代函数。

一个有用的函数 multiprocessing.cpu_count()

multiprocess.cpu_count()可以返回本计算机cpu的数量。

我们在新建一个进程池的时候,如果不填写任何参数,那么进程池的容量默认就是cpu的数量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值