首页 > 解决方案 > 如何在“后台”中运行部分脚本(单个函数)?

问题描述

我在具有以下基本结构(伪代码)的服务器上运行 python 脚本:

for data_item in data_items:
    processed_result=process_data(data_item); #this takes time T0
    upload_result_to_site(processed_result) #this takes time T1

基本约束是:

  1. data_items是一个(大)数据列表
  2. process_data()使用大量cpu。
  3. upload_result_to_site()占用很少的CPU。
  4. T0= 5*T1(大约)

现在,我的服务器时间有限,我想将其全部用于 cpu-intensive process_data(),而不是 on upload_result()。可惜 upload_result_to_site()是必须的。

一种解决方案是运行:

upload_result_to_site(processed_result)

在“后台”中,进程可以在 unix 的后台运行。

os.popen3我可以在后台(通过或)运行整个脚本,subprocess也可以使用守护进程。但我想要这个问题的最简单的解决方案。我找不到使用子进程仅调用脚本的一部分(单个函数)的方法

multiprocessing.Pool.map()可以使用,但是由它创建的进程必须在某个时候加入和终止,否则子进程的数量会不断增长)。

有没有一种简单的方法可以做到这一点?

更新:目前我正在使用这种解决方法:

for data_item in data_items:
    processed_result=process_data(data_item); #this takes time T0
    os.system("myscript.py upload_result_to_site processed_result &")

其中myscript.py是脚本的名称,并且适当的处理程序存在于__name__==__main__. (理论上的)缺点是这可能仅适用于 unix。由于我的服务器运行 unix,这对我来说很好。如果有人有更好的解决方案,请回答。

标签: pythonmultithreadingservermultiprocessing

解决方案


真正长期的简单解决方案是为自己创建所需的基本构建块。您的脚本正在做两件非常不同的事情。

“自然”的解决方案是将您的脚本变成一个模块,它只是提供不同的服务。

然后,您可以编写一个或多个导入该模块的脚本,然后您可以使用 popen3/subprocess 简单地调用一个仅上传单个结果的小脚本。


推荐阅读