系列文章目录
例如:第一章多进程数据处理
一、子进程(Process类)
调用process来对函数进行封装,可以根据需求对多个函数进程封装调用,
代码如下:
from multiprocessing import Process
def f(name):
print('hello', name)
if __name__ == '__main__':
#调用子子进程来处理函数
p1 = Process(target=f, args=('bob',))
p2 = Process(target=f, args=('pop',))
#开始进程
p1.start()
p2.start()
#终止进程
p1.join()
p2.join()
二、Pool类
Pool 对象,可以赋予函数并行化处理一系列输入值的能力,可以将输入数据分配给不同进程处理(数据并行),Pool实现多进程的函数有apply(), apply_async(), map(), imap();帮助文档
1.调用方式
代码如下:
from multiprocessing import Pool
import time
def f(x):
return x*x
if __name__ == '__main__':
with Pool(processes=4) as pool: # start 4 worker processes
# 利用多进程对函数进行封装,
#函数只会在一个进程池中的一个工作进程中执行,
#不支持迭代对象(ite)的输入
# apply_async(func[, args[, kwds[, callback[, error_callback]]]]),返回一个pool.ApplyResult对象
result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously in a single process,必须要加逗号,对应函数的输入函数
# prints "100" unless your computer is *very* slow
print(result.get())
# [map(func, iterable[, chunksize])]
# 但它只支持一个 iterable 参数,这个方法会将可迭代对象分割为许多块,然后提交给进程池
# 返回可迭代对象,如下输出的是一个列表
print(pool.map(f, range(10))) # prints "[0, 1, 4,..., 81]"
# 对于多个可迭代对象,返回一个IMAPiterate;调用next()得到相应的值
it = pool.imap(f, range(10))
print(next(it)) # prints "0"
print(next(it)) # prints "1"
print(it.next(timeout=1)) # prints "4" unless your computer is *very* slow
# 利用lamda表达式遍历列表调用多进程操作
pool = Pool(3)
results = [pool.apply_async(f, args=(num,)) for num in [1,2,3,4,5]]
# 返回一个多进程列表
results = [p.get() for p in results]
print(results)