python - 如何在“后台”中运行部分脚本(单个函数)?
问题描述
我在具有以下基本结构(伪代码)的服务器上运行 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
基本约束是:
data_items
是一个(大)数据列表process_data()
使用大量cpu。upload_result_to_site()
占用很少的CPU。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,这对我来说很好。如果有人有更好的解决方案,请回答。
解决方案
真正长期的简单解决方案是为自己创建所需的基本构建块。您的脚本正在做两件非常不同的事情。
“自然”的解决方案是将您的脚本变成一个模块,它只是提供不同的服务。
然后,您可以编写一个或多个导入该模块的脚本,然后您可以使用 popen3/subprocess 简单地调用一个仅上传单个结果的小脚本。
推荐阅读
- sql - 使用重复值对 SQL 查询中的行重新编号
- c# - Url.Action 未输出自定义映射控制器路由
- vue.js - 在这种情况下,组织 Vue.js 组件之间通信的最佳方式是什么?
- reportbuilder3.0 - 获取与装配相关的所有序列号以显示
- c++ - 我不明白 C++ 代码的一部分,有人可以解释一下吗?
- python - 运行 python azure 函数应用程序时遇到错误:ImportError: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found
- design-patterns - 没有断路器可能会发生什么样的灾难性级联?
- python - 从 tkinter Text 小部件中删除尾随空格
- python - 当我在 vsdode 中运行代码时,如何防止打开 python 调试控制台?
- html - 为什么会发生变化
element in index.html not reflected in the cypress interface?</h1> <div id="body"><p>I have been trying to understand the cypress file & folder structure when used with cucumber and vue.js but it's been driving me cra