Python中的多进程是什么
发布时间:2025-11-03 16:23:30

多进程 multiprocessing
因为Python是跨平台的,所以自然要提供跨平台的多流程支持。multiprocesing模块是跨平台版本的多流程模块。
multiprocesing模块提供了一个process类来代表一个过程对象。
Unix/Linux操作系统提供fork()系统调用,非常特殊。普通函数调用,调用一次,返回一次,但fork()调用一次,返回两次,因为操作系统自动复制当前过程(称为父过程)一份(称为子过程),然后在父过程和子过程中返回。
子过程总是返回0,而父过程返回子过程的ID。原因是一个父亲的过程可以启用许多子过程。因此,父亲的过程应该记录每个子过程的ID,而子过程只需调用getpid()即可获得父亲过程的ID。
Python的os模块包括fork,可以在Python程序中轻松创建子过程:
importos
print('Process(%s)start...'%os.getpid())
#OnlyworksonUnix/Linux/Mac:
pid=os.fork()
ifpid==0:
print('Iamchildprocess(%s)andmyparentis%s.'%(os.getpid(),os.getppid()))
else:
print('I(%s)justcreatedachildprocess(%s).'%(os.getpid(),pid))运行结果如下:
Process(69673)start... I(69673)justcreatedachildProcess(69674) Iamchildproces(69674)andmyparentis6973.
通过fork调用,一个过程可以在收到新任务时复制一个子过程来处理新任务。常用的Apache服务器是父亲过程监控端口。每当有新的http请求时,fork出子过程就会处理新的http请求。
但是windows操作系统中没有这个fork。因此,为了保证不同操作系统之间的调用,出现了处理fork的通用模块。
multiprocessing模块是跨平台版本的多进程模块。
multiprocesing模块提供了一个process类来代表一个过程对象。以下示例展示了启动子过程并等待其结束:
#!/usr/bin/envpython
#coding=utf-8
frommultiprocessingimportProcess
importos
"""
子进程要执行的代码
"""
defrun_proc(name):
print('Runchildprocess%s(%s)'%(name,os.getpid()))
if__name__='__main__':
print('Parentprocess%s.'%os.getpid())
p=Process(target=run_proc,args=('test_code',))
print('Childprocesswillstart.')
p.start()
p.join()
print('Childprocessend.')结果如下:
$pythonforkbymutilprocessing.py Parentprocess7027. Childprocesswillstart. Runchildprocesstest_code(70228) Childprocessend.
创建子过程时,只需传输执行函数和函数的参数,创建Process实例,并通过start()启动,使创建过程比fork()更简单。
join()该方法可在子过程结束后继续向下运行,通常用于过程间的同步。
