1.target指定目标函数来初始化进程
import multiprocessing
import time
def worker(interval):
n = 5
while n > 0:
print("The time is {0}".format(time.ctime()))
time.sleep(interval)
n -= 1
if __name__ == "__main__":
p = multiprocessing.Process(target=worker, args=(3,))
p.start()
print("p.pid:", p.pid)
print("p.name:", p.name)
print("p.is_alive:", p.is_alive())
2. 重写Process类来初始化线程
import multiprocessing
import time
import os
lock = multiprocessing.Lock()
s = multiprocessing.Semaphore(2)
class ClockProcess(multiprocessing.Process):
def __init__(self, interval):
multiprocessing.Process.__init__(self)
self.interval = interval
def run(self):
s.acquire()
lock.acquire()
n = 5
while n > 0:
print("the time is {0}".format(time.ctime()))
time.sleep(self.interval)
n -= 1
lock.release()
s.release()
if __name__ == '__main__':
# lock = multiprocessing.RLock()
p = ClockProcess(3)
p.daemon = True
p.start()
time.sleep(7)
os.kill(p.pid,9)
p.join()
3.RuntimeError
# RuntimeError:
# Attempt to start a new process before the current process
# has finished its bootstrapping phase.
#
# This probably means that you are on Windows and you have
# forgotten to use the proper idiom in the main module:
#
# if __name__ == '__main__':
# freeze_support()
# ...
#
# The "freeze_support()" line can be omitted if the program
# is not going to be frozen to produce a Windows executable.
原因
由于Python运行过程中,新创建进程后,进程会导入正在运行的文件,即在运行代码的时候,代码在运行到mp.Process时,新的进程会重新读入该代码,对于没有if name=="main"保护的代码,新进程都认为是要再次运行的代码, 这是子进程又一次运行mp.Process,但是在multiprocessing.Process的源码中是对子进程再次产生子进程是做了限制的, 是不允许的,于是出现如上的错误提示。
解决方法
- 多进程一般在if__name__=="main"模块下调用
在Python有关main的文档中 【2】 说明“main”是代码执行时的最高的命名空间(the name of the scope in which top-level code executes),当代码被当做脚本读入的时候,命名空间会被命名为“main”,对于在脚本运行过程中读入的代码命名空间都不会被命名为“main”。 这也就是说创建的子进程是不会读取name=="main"保护下的代码。