多进程 multiprocessing
Python既然是跨平台的,自然应该提供跨平台的多进程支持。多处理模块是多处理模块的跨平台版本。
multiprocessing模块提供了一个Process类来代表一个进程对象。
Unix/Linux操作系统提供了一个fork()系统调用,非常特殊。普通函数调用调用一次返回一次,但是fork()调用一次返回两次,因为操作系统会自动复制当前进程(称为父进程)(称为子进程),然后,分别在返回中父进程和子进程。
子进程总是返回0,而父进程返回子进程的ID。这样做的原因是一个父进程可以fork出多个子进程,所以父进程必须记录每个子进程的ID,子进程只需要调用getppid()获取父进程的ID即可。
Python的os模块封装了常用的系统调用,包括fork,可以方便的在Python程序中创建子进程:
import os
print('Process (%s) start...' % os.getpid())
# Only works on Unix/Linux/Mac:
pid = os.fork()
if pid == 0:
print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))
else:
print('I (%s) just created a child process (%s).' % (os.getpid(), pid))
运行结果如下:
Process (69673) start ...
I (69673) just created a child Process(69674)
I am child proces (69674) and my parent is 69673.
通过 fork 调用,进程可以在收到新任务时复制子进程来处理新任务。常见的Apache服务器是父进程监听端口。每当有新的 http 请求时,子进程就会被 fork。处理新的 http 请求。
但是这个fork在windows操作系统中是不存在的。于是出现了一个通用的处理fork的模块来保证不同操作系统之间的调用。
multiprocessing模块就是跨平台版本的多进程模块。
multiprocessing 模块提供了一个 Process 类来表示一个进程对象。以下示例演示了启动子进程并等待它结束:
#!/usr/bin/env python
# coding=utf-8
from multiprocessing import Process
import os
"""
子进程要执行的代码
"""
def run_proc(name):
print('Run child process %s (%s)' % (name, os.getpid()))
if __name__ == '__main__':
print('Parent process %s.' % os.getpid())
p = Process(target=run_proc, args=('test_code',))
print('Child process will start.')
p.start()
p.join()
print('Child process end.')
执行结果如下:
$ python forkbymutilprocessing.py
Parent process 70227.
Child process will start.
Run child process test_code (70228)
Child process end.
创建子进程时,只需要传入一个执行函数和函数参数,创建一个Process实例,通过start()方法启动即可,创建进程比fork()更简单。
join()方法可以等待子进程结束后再继续运行,通常用于进程间的同步。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Python语言的特点和技巧是什么?10/21
- ♥ 如何用python开发应用程序08/28
- ♥ Python文件如何转换为字符串09/30
- ♥ python方法永久或临时对列表进行排序11/22
- ♥ python Task在协程中是如何调用的01/12
- ♥ 如何运行 python 3.412/03
内容反馈