在Python中打开和关闭多处理程序中的循环

2024-03-29 15:53:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在用Python运行一个模拟程序,它需要我运行大量的进程。每个进程都有一个执行特定代码块的循环。在

我面临的问题是,我需要进程运行一段未知的时间(直到我的实验完成)。事先没有办法知道这段时间的价值。在

我正在寻找一种方法来终止进程,或者在实验完成后让它们停止执行。在

目前,我已经使用Python的多处理模块中的管理器创建了一个标志变量。每个子进程都包含一个循环,该循环仅在该标志设置为true时执行。这解决了这个问题,但当toggle标志设置为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:

我想知道是否有一个合适的方法来做我想做的事情。我甚至不知道我是否使用了正确的术语。在

主流程代码如下:

^{pr2}$

启动流程的代码是:

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进程,这些进程依次在启用toggle标志时启动多个线程,并在禁用该标志时停止并完成。在

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


Tags: 方法代码inpyselfsend进程标志
1条回答
网友
1楼 · 发布于 2024-03-29 15:53:41

我想在程序结束之前,你没有加入你的子进程。因此子进程没有它们的父进程;-)

试试这个:

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()

相关问题 更多 >