我目前正在用 Python 运行一个模拟程序,该程序需要我运行大量进程。这些进程中的每一个都有一个执行特定代码块的循环。
我面临的问题是我需要进程运行未知的时间(直到我的实验完成)。没有办法事先知道这个时间的价值。
我正在寻找一种方法来终止进程,或者在实验完成后让它们停止执行。
目前,我在 Python 的多处理模块中使用 Manager 创建了一个标志变量。每个子进程都包含一个循环,该循环仅在此标志设置为 true 时执行。这解决了问题,但是当切换标志设置为 false 时,会产生许多错误,每个进程一个错误。
Traceback (most recent call last):
File "C:\Python33\lib\multiprocessing\process.py", line 258, in _bootstrap
self.run()
File "C:\Python33\lib\multiprocessing\process.py", line 95, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\Michael\PycharmProjects\untitled1\pmonitor.py", line 33, in backgroundTaskLauncher
while flag[0]:
File "<string>", line 2, in __getitem__
File "C:\Python33\lib\multiprocessing\managers.py", line 726, in _callmethod
conn.send((self._id, methodname, args, kwds))
File "C:\Python33\lib\multiprocessing\connection.py", line 207, in send
self._send_bytes(buf.getbuffer())
File "C:\Python33\lib\multiprocessing\connection.py", line 281, in _send_bytes
ov, err = _winapi.WriteFile(self._handle, buf, overlapped=True)
BrokenPipeError: [WinError 232] The pipe is being closed
Process Process-20:
我想知道是否有合适的方法来做我想做的事情。我什至不确定我是否使用了正确的术语。
主进程的代码如下:
if __name__ == '__main__':
manager = Manager()
flag = manager.list([True])
for taskSize in taskSizes:
flag[0] = True
for i in range(1,TASK_LAUNCHERS):
Process(target=backgroundTaskLauncher, args=(taskSize,flag)).start()
#Experiment goes here
flag[0] = False
启动过程中的代码是:
def backgroundTaskLauncher(taskSize,flag):
while flag[0]:
for i in range(0,CHUNK_AMOUNT):
Thread(target=task, args=(taskSize,)).start()
sleep(MICROCHUNK_GAP)
sleep(INTERCHUNK_GAP*random.random()*2)
本质上,main 方法调用了许多 backgroundTaskLauncher 进程,这些进程依次在启用切换标志时启动许多线程,并在禁用标志时停止并完成。
我正在寻找获得这种行为的正确方法。