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