Demo代码和引用知识点都参考自《理解Python并发编程一篇就够了 - 进程篇》–董伟明或作者个人公众号Python之美, 《Python Cookbook》和廖雪峰Python3教程。
基本使用
运用多进程时,将方法放在main()中,否则会出现异常警告。
Process()
基本使用:与Thread()
类似。
Pool()
基本使用:
其中map方法用起来和内置的map函数一样,却有多进程的支持。
from multiprocessing import Pool
pool = Pool(2)
pool.map(fib, [35] * 2)
multiprocessing.dummy
模块:
multiprocessing.dummy replicates the API of multiprocessing but is no more than a wrapper around the threading module.
对于以上部分知识点,没有实际运用过,只是单纯了解并编写Demo进行了练习,理解没有很透彻。
# -*- coding: utf-8 -*-
from multiprocessing import Process, Pool
from multiprocessing.dummy import Pool as DummyPool
import time
import datetime
def log_time(methond_name):
def decorator(f):
def wrapper(*args, **kwargs):
start_time = time.time()
res = f(*args, **kwargs)
end_time = time.time()
print('%s cost %ss' % (methond_name, (end_time - start_time)))
return res
return wrapper
return decorator
def fib(n):
if n <=2 :
return 1
return fib(n-1) + fib(n-2)
@log_time('single_process')
def single_process():
fib(33)
fib(33)
@log_time('multi_process')
def multi_process():
jobs = []
for _ in range(2):
p = Process(target=fib, args=(33, ))
p.start()
jobs.append(p)
for j in jobs:
j.join()
@log_time('pool_process')
def pool_process():
pool = Pool(2)
pool.map(fib, [33]*2)
@log_time('dummy_pool')
def dummy_pool():
pool = DummyPool(2)
pool.map(fib, [33]*2)
if __name__ == '__main__':
single_process()
multi_process()
pool_process()
dummy_pool()
基于Pipe的parmap
理解稍有困难。
队列
实现生产消费者模型,一个队列存放任务,一个队列存放结果。
multiprocessing
模块下也有Queue
,但不提供task_done()
和join()
方法。故利用Queue
存放结果,JoinableQueue()
来存放任务。
仿照的Demo,一个消费者进程和一个生产者进程:
# -*- coding: utf-8 -*-
from multiprocessing import Process, Queue, JoinableQueue
import time
import random
def double(n):
return n * 2
def producer(name, task_q):
while 1:
n = random.random()
if n > 0.8: # 大于0.8时跳出
task_q.put(None)
print('%s break.' % name)
break
print('%s produce %s.' % (name, n))
task_q.put((double, n))
def consumer(name, task_q, result_q)</