在python中为多个文件并行运行相同的函数

在python中为多个文件并行运行相同的函数,python,celery,Python,Celery,我试图为多个文件并行运行一个函数,并希望所有文件在某个点之前终止 例如: 有一个循环 def main(): for item in list: function_x(item) function_y(list) 现在我想要的是,这个函数应该对所有项目并行运行。但是在调用my函数y之前,应该对所有项目执行此函数 我打算用芹菜做这个。但我不明白如何做到这一点。您可以使用线程来实现这一点线程。join是您需要的功能,此功能块将一直保留到线程完成。 您可以这样做: import

我试图为多个文件并行运行一个函数,并希望所有文件在某个点之前终止

例如: 有一个循环

def main():
  for item in list:
     function_x(item)

  function_y(list)
现在我想要的是,这个
函数应该对所有项目并行运行。但是在调用my
函数y
之前,应该对所有项目执行此函数


我打算用芹菜做这个。但我不明白如何做到这一点。

您可以使用线程来实现这一点<代码>线程。join
是您需要的功能,此功能块将一直保留到线程完成。
您可以这样做:

import threading
threads = []
def main():
  for item in list:
     t = threading.Thread(target=function_x, args=(item,))
     threads.append(t)
     t.start()

  # block until all the threads finish (i.e. until all function_a functions finish)    
  for t in threads:
     t.join()

  function_y(list)
,这就是我认为你想要的。使用
AsyncResult.get()
而不是
AsyncResult.ready()
来阻止

#!/bin/env python

import concurrent.futures

def function_x(item):
    return item * item


def function_y(lst):
    return [x * x for x in lst]


a_list = range(10)


if __name__ == '__main__':

    with concurrent.futures.ThreadPoolExecutor(10) as tp:

        future_to_function_x = {
            tp.submit(function_x, item): item
            for item in a_list
        }


    results = {}

    for future in concurrent.futures.as_completed(future_to_function_x):

        item = future_to_function_x[future]

        try:
            res = future.result()
        except Exception as e:
            print('Exception when processing item "%s": %s' % (item, e))
        else:
            results[item] = res


    print('results:', results)

    after = function_y(results.values())

    print('after:', after)
输出:

results: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
after: [0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561]

这是我最后的测试代码

我所需要做的就是使用多处理库

来自多处理导入进程的

从时间上导入睡眠
赞成者=[]
def功能_x(i):
对于范围(0,5)内的j:
睡眠(3)
打印i
def函数_y():
打印“完成”
def main():
对于范围(0,3)内的i:
打印“线程已启动”
p=进程(目标=函数,参数=(i,))
附件(p)
p、 开始()
#阻塞直到所有线程完成(即阻塞直到所有函数调用完成)
对于专业领域的t:
t、 加入
函数_y()

您可以使用,这是一个用于编写并行和分布式Python的库

只需使用
@ray.remote
声明
函数x
,然后使用
函数x.remote
调用它即可并行执行,并且可以使用
ray.get
检索结果

import ray
import time

ray.init()

@ray.remote
def function_x(item):
    time.sleep(1)
    return item

def function_y(list):
    pass

list = [1, 2, 3, 4]

# Process the items in parallel.
results = ray.get([function_x.remote(item) for item in list])

function_y(list)

查看。

注意,列表是类型名称,因此您最好为列表使用不同的变量名称。感谢Elisha为我提供了一种方法。但我想并行运行这些进程,两个线程不能同时在同一代码上工作。但是我找到了解决方案,我只需要使用多处理而不是线程,而且大多数事情都是一样的。为了更好地理解,请阅读此文章。线程实际上是同时运行的。这不是线程和进程之间的区别。这给了我下面一个错误。RuntimeError:试图在当前进程完成引导阶段之前启动新进程。这可能意味着您没有使用fork启动子进程,并且忘记了在主模块中使用正确的习惯用法:if name='main':freeze\u support()或“freeze\u support()”如果程序不会被冻结以生成可执行文件,则可以省略第行。