Python 如何同时在两个列表上运行函数?

Python 如何同时在两个列表上运行函数?,python,python-3.x,multithreading,parallel-processing,Python,Python 3.x,Multithreading,Parallel Processing,我有一个简单的问题。本质上,我希望同时或并行地在列表上运行函数 这就是我正在处理的问题 def func(x): print(x) for objectList in space: for subObject in objectList: func(subObject) 我希望能够在每个objectList上同时运行func()。我知道(实际上我不知道,这就是为什么我要问如何做到这一点)这是线程或并行,但这是我第一次尝试这样做 我的问题是,是否有python中的

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

这就是我正在处理的问题

def func(x):
    print(x)
for objectList in space:
    for subObject in objectList:
        func(subObject)
我希望能够在每个
objectList
上同时运行
func()
。我知道(实际上我不知道,这就是为什么我要问如何做到这一点)这是线程或并行,但这是我第一次尝试这样做

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

如果我在这个网站上违反了一条规则,或者你认为这个问题很愚蠢,或者是重复的,或者诸如此类的话,我很抱歉。

来自python文档:

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

您可以使用此模式,该模式也来自:


正如其他人所指出的,使用线程和并行计算应该有一个有效点,因为它还需要您执行其他操作,如输入/负载分配和管理工作线程(工作线程)。当然,在这些机制中建立了一些库。对于简单的应用程序,您可以只使用(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.')

即使是线程或并行也不能同时工作——执行之间的延迟总是很小的。在Python中的线程中,有时它比不使用线程运行要花费更多的时间。@furas:有时使用线程/并行时,它确实同时发生(例如,如果线程在独立的CPU上运行,或者在同一CPU的独立内核上运行)。但对于CPython,由于GIL,这可能很难实现。@psmears我也在考虑GIL的问题:)您是要在每个对象列表上并行运行func(),还是要在所有对象列表中的每个子对象上并行运行func()?
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.')