1

我目前正在用 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 进程,这些进程依次在启用切换标志时启动许多线程,并在禁用标志时停止并完成。

我正在寻找获得这种行为的正确方法。

4

1 回答 1

1

我认为您缺少在程序结束之前加入您的子进程。所以子进程没有他们的爸爸;-)

尝试这个:

if __name__ == '__main__':
    manager = Manager()
    flag = manager.list([True])
    for taskSize in taskSizes:
        flag[0] = True
        processes = [] # a list to store the process handles 
        for i in range(1,TASK_LAUNCHERS):
            p = Process(target=backgroundTaskLauncher, args=(taskSize,flag))
            p.start()
            processes.append(p) # save process handle
        # Experiment goes here (I think it goes here (unindented(?)))
        flag[0] = False
        # after you are done with your experiment, join all child processes
        for p in processes:
            p.join()
于 2013-08-15T20:33:23.103 回答