python进程池_python中的进程池

写在前面

进程池

本篇文章主要从以下几个方面讲述:python多进程并发操作multiprocessing模块

Pool类

python多进程并发操作

Q:如果你是在windows上编写多进程的服务程序,那么由于Windows没有fork调用,所以无法用python编写多进程的程序了吗?

A:由于python是跨平台的,所以可以利用multiprocessing模块来实现跨平台版本的多进程模块。

这也就引入了multiprocessing是什么。

multiprocessing模块

multiprocessing模块提供了一个process类来代表一个进程对象,这个模块表示像线程一样管理进程,这个是multiprocessing的核心,它与threading相似,对多核的CPU的利用率会比threading更好。

对于multiprocessing中的process类的构造方法如下:

_init_(self, group=None, target=None, name=None, args=(), kwargs={})

参数说明:group:进程所属组。(一般为缺省)

target:表示调用对象。

args:表示调用对象的位置参数元组。

name:别名

kwarges:表示调用对象的字典。

import multiprocessing

def do(n) :

#获取当前进程的名字

name = multiprocessing.current_process().name

print(name,'starting')

print("worker ", n)

return

if __name__ == '__main__' :

numList = []

for i in range(5):

p = multiprocessing.Process(target=do, args=(i,))

numList.append(p)

p.start()

p.join()

print("Process end.")

输出结果:

Process-1 starting

worker 0

Process end.

Process-2 starting

worker 1

Process end.

Process-3 starting

worker 2

Process end.

Process-4 starting

worker 3

Process end.

Process-5 starting

worker 4

Process end.

总结:创建子进程时,只需要传入一个执行函数和函数的参数,创建一个process实例。并用其start()方法启动,用join()方法表示等待子进程结束以后再继续往下运行,通常用于进程进程间的同步。

pool类

pool类可以提供指定数量的进程供用户调用,当有新的请求提交到pool中时:如果pool还没有满,就会创建一个新的进程来执行请求。

如果pool满了,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求。

apply()

apply(func[, args=()[, kwds={}]])

用于传递不定参数,同python中的apply函数一致,主进程会被阻塞直到函数执行结束(3.x之后不再使用)

apply_async()

apply_async(func[, args=()[, kwds={}[, callback=None]]])

与apply用法一致,但它是非阻塞的且支持结果返回后进行回调。

map()

map(func, iterable[, chunksize=None])

pool类中的map方法,与内置的map函数用法基本一致,会使进程阻塞直到结束返回。

ps:虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程。

map_async()

map_async(func, iterable[, chunksize[, callback]])

同上,区别为它是非阻塞的。

close()

关闭进程池,使其不再接受新的任务。

terminal()

结束工作进程,不再处理未处理的任务。

join()

主进程阻塞等待子进程的推出,join方法要在close或terminate之后使用。

import time

from multiprocessing import Pool

def run(fn):

#fn: 函数参数是数据列表的一个元素

time.sleep(1)

print(fn*fn)

if __name__ == "__main__":

testFL = [1,2,3,4,5,6]

print ('顺序:') #顺序执行(也就是串行执行,单进程)

s = time.time()

for fn in testFL:

run(fn)

t1 = time.time()

print ("顺序执行时间:", int(t1 - s))

print ('concurrent:') #创建多个进程,并行执行

pool = Pool(10) #创建拥有10个进程数量的进程池

#testFL:要处理的数据列表,run:处理testFL列表中数据的函数

pool.map(run, testFL)

pool.close()#关闭进程池,不再接受新的进程

pool.join()#主进程阻塞等待子进程的退出

t2 = time.time()

print ("并行执行时间:", int(t2-t1))

输出结果为:

顺序:

1

4

9

16

25

36

顺序执行时间: 6

concurrent:

1

4

9

16

25

36

并行执行时间: 1

半年前在完成毕业论文时,整理的Python进程池问题所写初稿,发出来供大家参考,可能有很多没有梳理清楚的地方,如有错误还希望多多包涵并指证。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值