多进程处理(Multiprocessing)
介绍
python的多进程处理,这里使用的是multiprocessing模块;首先要了解Cpython解释器中GIL(global interpreter lock)对python处理多线程程序的影响,然后为了提高并发任务(前提是你需要)运行效率
实例1: 使用一般函数构建
from multiprocessing import Process
from datetime import datetime
import time
def job(name, sleep_time):
"""
任务
"""
print('{name}任务开始'.format(name=name))
time.sleep(sleep_time)
print('{name}任务结束'.format(name=name))
def main():
pa = Process(target=job, args=('A', 5,))
pb = Process(target=job, args=('B', 5,))
pa.start()
pb.start()
pa.join()
pb.join()
if __name__ == '__main__':
begin = datetime.now()
main()
end = datetime.now()
print('总耗时', end-begin)
总耗时 0:00:05.217374
实例2: 重构Process类构建
from multiprocessing import Process
from datetime import datetime
import time
class JobProcess(Process):
"""
多进程自建任务
"""
def __init__(self, name='default', sleep_time=0):
"""
初始化函数
参考[Process类自构](https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process)
"""
Process.__init__(self)
self.name = name
self.sleep_time = sleep_time
def run(self):
"""
关键方法
"""
print('{name}任务开始'.format(name=self.name))
time.sleep(self.sleep_time)
print('{name}任务结束'.format(name=self.name))
def main():
pa = JobProcess(name='A', sleep_time=5)
pb = JobProcess(name='B', sleep_time=5)
pa.start()
pb.start()
pa.join()
pb.join()
if __name__ == '__main__':
begin = datetime.now()
main()
end = datetime.now()
print('总耗时', end-begin)
总耗时 0:00:05.217374
备注:
- 在windows和Linux环境使用Process重构类方法时有些差异,在windows上会有类无法序列化的问题
- 使用logging模块
- 控制台打印时可以使用公共的logger对象
- 向文件中写日志时可以使用logging的filter加上multiprocessing的queue