Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用多处理的简单进程管理器_Python_Multiprocessing - Fatal编程技术网

在Python中使用多处理的简单进程管理器

在Python中使用多处理的简单进程管理器,python,multiprocessing,Python,Multiprocessing,我有许多需要执行的任务(彼此独立,由Python中的一些代码表示)。它们的执行时间各不相同。我也有有限的资源,因此最多可以同时运行N个任务。目标是尽可能快地完成整个任务堆栈的执行 似乎我正在寻找一种管理器,当资源可用时启动新任务并收集完成的任务 是否有任何已经制定的解决方案,或者我应该自己编写 有什么需要我记住的注意事项吗 以下是一个简单的代码片段,它应该符合要求: import multiprocessing import time POOL_SIZE = 4 STEP = 1 def

我有许多需要执行的任务(彼此独立,由Python中的一些代码表示)。它们的执行时间各不相同。我也有有限的资源,因此最多可以同时运行N个任务。目标是尽可能快地完成整个任务堆栈的执行

似乎我正在寻找一种管理器,当资源可用时启动新任务并收集完成的任务

  • 是否有任何已经制定的解决方案,或者我应该自己编写
  • 有什么需要我记住的注意事项吗

    • 以下是一个简单的代码片段,它应该符合要求:

      import multiprocessing
      import time
      
      POOL_SIZE = 4
      STEP = 1
      
      
      def sleep(seconds: int):
          time.sleep(seconds)
      
      
      def main():
          tasks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
          pool = [None] * POOL_SIZE
      
          while tasks or [item for item in pool if item is not None]:
              for i in range(len(pool)):
                  if pool[i] is not None and not pool[i].is_alive():
                      # Finished task. Clear the resource.
                      pool[i] = None
      
                  if pool[i] is None:
                      # Free resource. Start new task if any are left.
                      if tasks:
                          task = tasks.pop(0)
                          pool[i] = multiprocessing.Process(target=sleep, args=(task,))
                          pool[i].start()
      
              time.sleep(STEP)
      
      
      if __name__ == '__main__':
          main()
      
      管理器有一个任意长度的
      tasks
      列表,为了简单起见,这里的任务由整数表示,整数作为
      sleep
      函数的参数。它还有一个
      列表,最初为空,表示可用资源

      经理定期访问所有当前正在运行的流程,并检查它们是否已完成。如果资源可用,它还会启动新进程。整个循环都在重复,直到没有任务和当前正在运行的进程。
      步骤
      值用于节省计算能力-通常不需要每隔毫秒检查一次正在运行的进程


      至于注意事项,在使用多处理时应牢记这一点。

      据我所知,您的
      main
      将变成:

      def main():
          tasks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
          with multiprocessing.Pool(POOL_SIZE) as pool:
              pool.map(sleep, tasks)
      

      i、 e.您刚刚重新实现了一个池,但效率低下(
      pool
      在可能的情况下重用
      Process
      es),而且在不太安全的情况下,
      pool
      花费了大量精力来清理异常

      您可以使用
      multiprocessing.pool
      为什么不使用建议的
      pool().map
      API?@SamMason我刚刚开始学习
      多处理
      模块和所有那些
      管道
      队列
      事件
      屏障
      信号灯
      管理器
      。。。课程对我来说还是有点太难理解了。我设法从头开始实现该功能,但我仍然对是否(以及如何)使用
      多处理类实现该功能感兴趣。这就是为什么我贴出这个问题。好吧,那太尴尬了。并行编程是思维上的一大步——你的代码简直太简单了,我仍然很难想象在这一两行代码后面到底发生了什么。尽管如此,它还是帮了我很多忙,谢谢。@Jeyekomon开源代码的乐趣在于,只要你愿意,它就在那里:)