【问题标题】:How can I run a function on two lists at the same time?如何同时在两个列表上运行一个函数?
【发布时间】:2019-04-20 21:07:11
【问题描述】:

我有一个简单的问题。本质上,我想同时或并行地在列表列表上运行一个函数。

这基本上就是我正在使用的东西

def func(x):
    print(x)
for objectList in space:
    for subObject in objectList:
        func(subObject)

理想情况下,我希望能够同时在每个 objectList 上运行 func()。我知道(实际上我不知道,这就是为什么我要问如何做到这一点)这是线程或并行,但这是我第一次尝试。

我的问题是,python 中是否有模块或内置函数或标准方式来完成此任务?

很抱歉,如果我以某种方式违反了本网站或其他内容的规则,或者您认为这个问题很愚蠢或重复或其他任何问题。

【问题讨论】:

  • 即使线程或并行也不能立即工作 - 执行之间的延迟总是很小。在 Python 的线程中,有时它会比没有线程运行花费更多的时间。
  • @furas:有时对于线程/并行性,它确实同时发生(例如,如果线程在独立 CPU 或同一 CPU 的独立内核上运行)。但是由于 GIL,使用 CPython 可能很难实现。
  • @psmears 我也在考虑 GIL 的问题 :)
  • 您是要在每个 objectList 上并行运行 func(),还是要在所有 objectList 中的每个 subObject 上并行运行 func()?

标签: python python-3.x multithreading parallel-processing


【解决方案1】:

来自 python 文档:

Pool 对象 [...] 提供了一种方便的方法,可以跨多个输入值并行执行函数,跨进程分配输入数据(数据并行性)

你可以使用这个模式,同样来自docs

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))

【讨论】:

    【解决方案2】:

    正如其他人指出的那样,您应该有一个有效的观点来使用线程和并行计算,因为它还需要您执行其他操作,例如输入/负载分配和管理工作线程(工作线程)。当然,这些机制中内置了一些库。对于简单的应用程序,您可以只使用 (threading.Thread) 类。这是一个使用线程的简单示例。此代码将为空间的每个元素创建工作器。

    import threading
    
    
    def func(x):
        print(x)
    
    
    class FuncThread(threading.Thread):
        def __init__(self, x):
            threading.Thread.__init__(self)
            self.x = x
    
        def run(self):
            #worker code = func(x)
            print('doing stuff with:', self.x)
    
    
    space = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
    worker_handlers = list()
    
    for objectList in space:
        for subObject in objectList:
            worker_handlers.append(FuncThread(subObject))
    
    for worker in worker_handlers:
        worker.start()
    
    print('The main program continues to run in foreground.')
    
    for worker in worker_handlers:
        worker.join()  # Wait for the background tasks to finish
    print('Main program waited until background was done.')
    

    【讨论】:

      猜你喜欢
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 2021-07-20
      • 2017-07-26
      相关资源
      最近更新 更多