<bdo id='WPQ9a'></bdo><ul id='WPQ9a'></ul>

  • <i id='WPQ9a'><tr id='WPQ9a'><dt id='WPQ9a'><q id='WPQ9a'><span id='WPQ9a'><b id='WPQ9a'><form id='WPQ9a'><ins id='WPQ9a'></ins><ul id='WPQ9a'></ul><sub id='WPQ9a'></sub></form><legend id='WPQ9a'></legend><bdo id='WPQ9a'><pre id='WPQ9a'><center id='WPQ9a'></center></pre></bdo></b><th id='WPQ9a'></th></span></q></dt></tr></i><div id='WPQ9a'><tfoot id='WPQ9a'></tfoot><dl id='WPQ9a'><fieldset id='WPQ9a'></fieldset></dl></div>

  • <legend id='WPQ9a'><style id='WPQ9a'><dir id='WPQ9a'><q id='WPQ9a'></q></dir></style></legend>

      <tfoot id='WPQ9a'></tfoot>

        <small id='WPQ9a'></small><noframes id='WPQ9a'>

      1. Python使用多进程运行含有任意个参数的函数

        时间:2023-12-16

          <tfoot id='QgDBx'></tfoot>

            <i id='QgDBx'><tr id='QgDBx'><dt id='QgDBx'><q id='QgDBx'><span id='QgDBx'><b id='QgDBx'><form id='QgDBx'><ins id='QgDBx'></ins><ul id='QgDBx'></ul><sub id='QgDBx'></sub></form><legend id='QgDBx'></legend><bdo id='QgDBx'><pre id='QgDBx'><center id='QgDBx'></center></pre></bdo></b><th id='QgDBx'></th></span></q></dt></tr></i><div id='QgDBx'><tfoot id='QgDBx'></tfoot><dl id='QgDBx'><fieldset id='QgDBx'></fieldset></dl></div>

            <small id='QgDBx'></small><noframes id='QgDBx'>

                <tbody id='QgDBx'></tbody>
            1. <legend id='QgDBx'><style id='QgDBx'><dir id='QgDBx'><q id='QgDBx'></q></dir></style></legend>

              • <bdo id='QgDBx'></bdo><ul id='QgDBx'></ul>
                • 我来详细讲解一下Python使用多进程运行含有任意个参数的函数的完整攻略。

                  攻略概要

                  Python中的multiprocessing模块提供了一种方便的方法在多个进程之间进行并发执行。我们可以使用多进程来运行任意个参数的函数。

                  大致的步骤如下:

                  1. 导入multiprocessing模块;
                  2. 定义需要运行的函数,这个函数可以拥有任意个参数;
                  3. 创建多个进程,让每个进程去运行这个函数,并将传入的参数传递给这个函数;
                  4. 在每个进程完成运算后,将结果返回给主进程进行处理。

                  下面,结合代码示例一步一步介绍。

                  示例一

                  下面的示例代码展示了如何在多进程中运行一个计算平方和的函数。

                  import multiprocessing
                  
                  def square_sum(*args):
                      return sum([x**2 for x in args])
                  
                  if __name__ == '__main__':
                      pool = multiprocessing.Pool(processes=4)
                      results = []
                  
                      for i in range(5):
                          result = pool.apply_async(square_sum, (i, i+1, i+2))
                          results.append(result)
                  
                      pool.close()
                      pool.join()
                  
                      for result in results:
                          print(result.get())
                  

                  首先,我们导入了multiprocessing模块。然后,我们定义了一个名为square_sum的函数,这个函数可以接受任意个参数。在这个示例中,我们将这些参数的平方相加,并返回结果。

                  在程序的主函数中,我们创建了一个包含4个进程的进程池,然后循环5次,每次调用apply_async方法启动一个进程,并将参数传递给square_sum函数。apply_async方法返回一个AsyncResult对象,我们将这些对象保存在一个叫做results的列表中。

                  接着,我们调用了进程池的close()和join()方法,这是必要的,这两个方法会等待所有进程都完成运算。

                  最后,我们遍历results列表,使用get方法获取每个AsyncResult对象的结果,并输出。

                  注意,在创建进程池时,我们需要使用if name == 'main':判断一下,这是Python多进程中的一个常见问题,具体可以看这里:https://docs.python.org/3/library/multiprocessing.html#all-platforms。

                  示例二

                  下面的示例代码展示了如何在多进程中运行一个函数,并使用进程间共享的Queue进行结果处理。

                  import multiprocessing
                  
                  def worker(task_queue, result_queue):
                     while True:
                        task = task_queue.get()
                        if task == 'STOP':
                           break
                        result = sum(task)
                        result_queue.put(result)
                  
                  if __name__ == '__main__':
                     task_queue = multiprocessing.Queue()
                     result_queue = multiprocessing.Queue()
                  
                     # start worker processes
                     pool = multiprocessing.Pool(processes=4, initializer=worker, initargs=(task_queue, result_queue))
                  
                     # put tasks into task queue
                     for i in range(100):
                        task_queue.put(range(1, i+1))
                  
                     # tell workers to stop
                     for i in range(pool._processes):
                        task_queue.put('STOP')
                  
                     # collect results from result queue
                     results = []
                     while not result_queue.empty():
                        result = result_queue.get()
                        results.append(result)
                  
                     # wait for workers to stop
                     pool.close()
                     pool.join()
                  
                     # print results
                     print(sum(results))
                  

                  在这个示例中,我们定义了一个名为worker的函数,这个函数从task_queue中获取任务,计算后将结果放入result_queue中,直到收到STOP信号;接着,我们创建了一个包含4个进程的进程池,将worker函数初始化后放到进程池中,并创建了两个进程间共享的Queue:task_queue和result_queue。

                  在主函数中,我们将100个任务放入task_queue中,同时向task_queue中放入4个STOP信号,用于告知worker进程已经完成任务;然后,我们从result_queue中取出所有结果,并求和输出。

                  最后,我们关闭进程池并等待所有进程完成。

                  注意,在创建进程池时,我们使用了initializer和initargs参数来初始化进程池中的所有进程,这样每个进程都可以访问task_queue和result_queue;同时,我们使用了一个while循环来等待所有结果被处理完毕,并在主进程中进行结果的聚合处理。

                  上一篇:Python多进程同步Lock、Semaphore、Event实例 下一篇:一篇文章带你了解Python的进程,线程和协程

                  相关文章

                  <legend id='5ixiJ'><style id='5ixiJ'><dir id='5ixiJ'><q id='5ixiJ'></q></dir></style></legend>

                    <tfoot id='5ixiJ'></tfoot>

                    1. <small id='5ixiJ'></small><noframes id='5ixiJ'>

                        <bdo id='5ixiJ'></bdo><ul id='5ixiJ'></ul>
                      <i id='5ixiJ'><tr id='5ixiJ'><dt id='5ixiJ'><q id='5ixiJ'><span id='5ixiJ'><b id='5ixiJ'><form id='5ixiJ'><ins id='5ixiJ'></ins><ul id='5ixiJ'></ul><sub id='5ixiJ'></sub></form><legend id='5ixiJ'></legend><bdo id='5ixiJ'><pre id='5ixiJ'><center id='5ixiJ'></center></pre></bdo></b><th id='5ixiJ'></th></span></q></dt></tr></i><div id='5ixiJ'><tfoot id='5ixiJ'></tfoot><dl id='5ixiJ'><fieldset id='5ixiJ'></fieldset></dl></div>