我的电脑上有些后台任务需要大量处理。以最高优先级运行这些任务仍然会导致交互速度缓慢,这让我很烦恼。
有没有比最大化友善更好的方法?
我希望一使用电脑,后台任务就停止。如果我五分钟左右不使用电脑,后台任务就会继续。
后台工作没有截止期限。即使花费更长时间也没关系。
我想减慢的工作是视频编码过程,它每个 CPU 使用一个线程。在我的笔记本电脑上有 4 个线程,负载为 400%。
答案1
在使用计算机时管理(暂停)繁重流程的另一种方法
我结合测试了下面的脚本kdenlive
,渲染了一个大视频。在测试中,它运行良好。(后台)脚本本身几乎不消耗任何资源。它唯一要做的就是每 5 秒检查一次目标进程是否运行。只有这样,它才会检查当前的空闲时间。两者都意味着没有什么到您的系统
该脚本基于 的使用xprintidle
。 xprintidle
跟踪键盘和鼠标事件并测量无活动的时间。如果要求高的过程开始,则立即暂停(因为计算机显然正在使用),命令如下:
kill -STOP <pid>
如果随后空闲时间超过某个(任意)时间限制,则使用以下命令恢复该过程:
kill -CONT <pid>
随后,如果空闲时间回到设定的时间限制以下,则该过程再次暂停,依此类推。
空闲时间之前/期间/之后的 CPU 使用情况,使用 melt 通过 kdenlive 渲染大型视频
关于 kill -STOP 和 kill -CONT
虽然在中提到了参数-STOP
和,但奇怪的是,并没有解释。然而,例如-CONT
man kill
这里我们可以读一下它的作用:
基本上kill -STOP 1234
会使用 暂停进程pid 1234
,然后kill -CONT 1234
恢复进程。这就像您可以让单个应用程序而不是整个计算机进入睡眠状态一样。
因此,当使用计算机时(非空闲),要求高的进程就会进入睡眠状态。
查找要暂停的进程
脚本随进程运行姓名(如果您使用计算机,您会希望暂停)作为一个参数。
诀窍是找到要暂停的正确进程。它不会是你的视频编辑器的名称,因为它肯定会使用外部工具进行渲染。在我的情况下,kdenlive
使用了melt
。脚本成功暂停melt
并在定义的空闲时间后恢复渲染。
top
如果不确定进程名称,可以使用该命令。top
在终端中运行并按Ctrl+M按内存使用情况排序。占用内存的进程将位于顶部。
剧本
#!/usr/bin/env python3
import subprocess
import time
import sys
limit = int(sys.argv[1])
proc = sys.argv[2]
def get(command):
return subprocess.check_output(command).decode("utf-8").strip()
def check_runs(proc):
try:
return get(["pgrep", proc])
except subprocess.CalledProcessError:
pass
pid1 = check_runs(proc)
t1 = int(int(get("xprintidle"))/1000)
while True:
time.sleep(5)
pid2 = check_runs(proc)
# (only) if the process exists, manage its activity
if pid2 != None:
t2 = int(int(get("xprintidle"))/1000)
# if the process just started, obviously the system is not idle ->
# pause the process (try in case it was killed by user in between):
if pid1 == None:
try:
subprocess.Popen(["kill", "-STOP", pid2])
except subprocess.CalledProcessError:
pass
# If there is a change in time status (breaktime entered or ended)
else:
if [t2 > limit, t1 > limit].count(True) == 1:
if t2 > limit:
cmd = ["kill", "-CONT", pid2]
else:
cmd = ["kill", "-STOP", pid2]
subprocess.Popen(cmd)
t1 = t2
pid1 = pid2
如何使用
脚本需要
xprintidle
sudo apt-get instal xprintidle
将上述脚本复制到一个空文件中,另存为
manage_proc.py
通过命令测试运行
python3 /path/to/manage_proc.py <seconds> <process_name>
<seconds>
您希望进程启动之前的空闲时间(以秒为单位)是多少。
启动消耗进程后剧本开始了。如果一切正常,请将脚本添加到启动应用程序:Dash > 启动应用程序> 添加命令:
python3 /path/to/manage_proc.py <seconds> <process_name>