Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多处理过程中间输出_Python_Multiprocessing_Joblib - Fatal编程技术网

Python 多处理过程中间输出

Python 多处理过程中间输出,python,multiprocessing,joblib,Python,Multiprocessing,Joblib,我有一个函数,可以加载数据并循环时间,例如 def calculate_profit(account): account_data = load(account) #very expensive operation for day in account_data.days: print(account_data.get(day).profit) 由于加载数据的成本很高,因此使用joblib/multiprocessing执行以下操作是有意义的: arr = [a

我有一个函数,可以加载数据并循环时间,例如

def calculate_profit(account):
    account_data = load(account) #very expensive operation
    for day in account_data.days:
        print(account_data.get(day).profit)
由于加载数据的成本很高,因此使用joblib/multiprocessing执行以下操作是有意义的:

arr = [account1, account2, account3, ...]
joblib.Parallel(n_jobs=-1)(delayed(calculate_profit)(arr))
但是,我有另一个昂贵的函数,我想应用于
计算利润
函数的中间结果。例如,假设将所有利润汇总并处理/发布到网站等是一项昂贵的操作。此外,我还需要前一天的利润来计算此函数中的利润变化

def expensive_sum(prev_day_profits, *account_profits):
    total_profit_today = sum(account_profits)
    profit_difference = total_profit_today - prev_day_profits

    #some other expensive operation
    #more expensive operations
所以我想

  • 并行运行多处理进程(以减轻加载所有昂贵帐户数据的负担)
  • 一旦每个多处理过程到达预定义点(例如,完成循环的一次迭代),将这些中间值返回到另一个函数(
    昂贵的求和
    )进行处理-假设每个单独的多处理过程无法继续,直到
    昂贵的求和
    返回
  • 但是,我希望保持多处理进程的活动状态,这样就不必重新初始化它们(减少开销)
  • 有没有办法做到这一点

    from multiprocessing import Manager
    queue = manager.Queue()
    
    一旦每个多处理过程到达预定义点 做

    同时,另一个昂贵的函数也可以

    queue.get(item)  ==>  blocking call for get
    

    昂贵的函数等待
    get
    并在获取值时继续处理它,然后再次等待
    get

    是否会阻止单个进程继续进行,直到队列返回?对于
    load()
    昂贵的求和()
    ,我们谈论的数据量是多少?因为如果你要传递大量数据,你可能会因为Python在进程之间交换数据时所做的酸洗/去酸洗芭蕾而失去通过多重处理所获得的任何优势。单个进程只需
    put
    值……队列不会return@zwer这只是一个玩具示例谢谢-您将如何实现get?@Michael的“阻塞”调用是默认的阻塞…如果你想要非阻塞,你可以使用
    get\u nowait()
    Cool谢谢!抱歉,还有一个问题-您是否从其他进程调用queue.get?您将如何初始化它?例如,如果我有10个进程运行queue.put(项[[0]),如何确保它们不会在进程(项[0],…,项[1])完成之前继续排队。put(项[1])?@Michael您可以使用
    queue.qsize()
    因此,一旦处理结束,队列大小将变小0@Michael您可以创建一个全局
    队列
    ,并在进程内使用它……或在函数所在类的
    \uuuu init\uuuu
    中使用它
    queue.get(item)  ==>  blocking call for get