知行编程网知行编程网  2023-01-14 01:00 知行编程网 隐藏边栏  1 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于Python中的多进程是什么的相关知识,希望可以帮到处于编程学习途中的小伙伴


什么是 Python 中的多处理


多进程 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()方法可以等待子进程结束后再继续运行,通常用于进程间的同步。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享