前面章节中,已经详解介绍了 2 种创建进程的方法,即分别使用 os.fork() 和 Process 类来创建进程。其中:
实际上,Python 创建的子进程执行的内容,和启动该进程的方式有关。而根据不同的平台,启动进程的方式大致可分为以下 3 种:
总的来说,使用类 UNIX 平台,启动进程的方式有以上 3 种,而使用 Windows 平台,只能选用 spawn 方式(默认即可)。
在了解以上 3 种进程启动方式的基础上,我们还需要知道手动设置进程启动方式的方法,大致有以下 2 种。
1) Python multiprocessing 模块提供了一个set_start_method() 函数,该函数可用于设置启动进程的方式。需要注意的是,该函数的调用位置,必须位于所有与多进程有关的代码之前。
例如,下面代码演示了如何显式设置进程的启动方式:
import multiprocessing
import os
print("当前进程ID:",os.getpid())
# 定义一个函数,准备作为新进程的 target 参数
def action(name,*add):
print(name)
for arc in add:
print("%s --当前进程%d" % (arc,os.getpid()))
if __name__=='__main__':
#定义为进程方法传入的参数
my_tuple = ("http://www.cdsy.xyz/computer/programme/Python/",\
"http://www.cdsy.xyz/computer/programme/shell/",\
"http://www.cdsy.xyz/computer/programme/java/")
#设置进程启动方式
multiprocessing.set_start_method('spawn')
#创建子进程,执行 action() 函数
my_process = multiprocessing.Process(target = action, args = ("my_process进程",*my_tuple))
#启动子进程
my_process.start()
程序执行结果为:
注意,由于此程序中进程的启动方式为 spawn,因此该程序可以在任意( Windows 和类 UNIX 上都可以 )平台上执行。
2) 除此之外,还可以使用 multiprocessing 模块提供的 get_context() 函数来设置进程启动的方法,调用该函数时可传入 "spawn"、"fork"、"forkserver" 作为参数,用来指定进程启动的方式。
需要注意的一点是,前面在创建进程是,使用的 multiprocessing.Process() 这种形式,而在使用 get_context() 函数设置启动进程方式时,需用该函数的返回值,代替 multiprocessing 模块调用 Process()。
例如,下面程序演示了如何使用 get_context() 函数设置进程启动:
import multiprocessing
import os
print("当前进程ID:",os.getpid())
# 定义一个函数,准备作为新进程的 target 参数
def action(name,*add):
print(name)
for arc in add:
print("%s --当前进程%d" % (arc,os.getpid()))
if __name__=='__main__':
#定义为进程方法传入的参数
my_tuple = ("http://www.cdsy.xyz/computer/programme/Python/",\
"http://www.cdsy.xyz/computer/programme/shell/",\
"http://www.cdsy.xyz/computer/programme/java/")
#设置使用 fork 方式启动进程
ctx = multiprocessing.get_context('spawn')
#用 ctx 代替 multiprocessing 模块创建子进程,执行 action() 函数
my_process = ctx.Process(target = action, args = ("my_process进程",*my_tuple))
#启动子进程
my_process.start()
程序执行结果为:
以上仅演示了在 Windows 平台上设置进程启动方式的效果,有兴趣的读者可自行尝试选择类 UNIX 平台测试其他启动进程的方式。