【问题标题】:Python - simplest way possible to run functions in parallelPython - 并行运行函数的最简单方法
【发布时间】:2024-01-21 04:48:01
【问题描述】:

我在做一些实际上应该很简单的事情时有点挣扎。我有一个函数可以进行一些长时间的计算,为了简化它,如下所示:

import time    
def compute_stuff(number):
   time.sleep(10)
   return [number*2, number*4]

我想并行运行此函数的两个实例并将它们的结果收集到一个数组中。我读过一些关于 Twisted reactor 的文章,它似乎提供异步查询,但是在一个线程中运行所有内容,所以当我这样做时:

from twisted.internet import reactor
import time

def compute_stuff(number):
   time.sleep(10)
   return [number*2, number*4]

reactor.callWhenRunning(compute_stuff, 1)
reactor.callWhenRunning(compute_stuff, 4)
reactor.callWhenRunning(compute_stuff, 2)
reactor.run()

它会等待第一个调用完成,然后再执行下一个调用。有没有办法让它平行? Twisted 是不是该走的路?

【问题讨论】:

    标签: python concurrency twisted reactor


    【解决方案1】:

    你可以试试线程模块

    import threading
    import time    
    
    def compute_stuff(number):
       print str(number) + "start"
       time.sleep(10)
       print str(number) + "end"
       return [number*2, number*4]
    
    
    threads = []
    for i in range(5):
        t = threading.Thread(target=compute_stuff, args=(i,))
        threads.append(t)
        t.start()
    

    【讨论】:

      【解决方案2】:

      使用task,您可以按以下间隔运行它们:

      from twisted.internet import task
      from twisted.internet import reactor
      import time
      
      def compute_stuff(number):
         time.sleep(10)
         return [number*2, number*4]
      
      t1 = task.callWhenRunning(compute_stuff, 1)
      t2 = task.callWhenRunning(compute_stuff, 4)
      t3 = task.callWhenRunning(compute_stuff, 2)
      
      t1.start(10) #run every 10 seconds
      t2.start(10)
      t3.start(10)
      
      reactor.run()
      

      但我不确定线程​​...

      【讨论】:

        最近更新 更多