def wait_cgroup(sock, execute_task, time_limit_ns, memory_limit_bytes, process_limit):
cgroup = CGroup()
try:
cgroup.memory_limit_bytes = memory_limit_bytes
cgroup.pids_max = process_limit
await cgroup.accept(sock)
start_idle = _get_idle()
while True:
cpu_usage_ns = cgroup.cpu_usage_ns
idle_usage_ns = int((_get_idle() - start_idle) / cpu_count() * 1e9)
time_usage_ns = max(cpu_usage_ns, idle_usage_ns)
time_remain_ns = time_limit_ns - time_usage_ns
if time_remain_ns <= 0:
return time_usage_ns, cgroup.memory_usage_bytes
try:
await wait_for(shield(execute_task), (time_remain_ns + WAIT_JITTER_NS) / 1e9)
return cgroup.cpu_usage_ns, cgroup.memory_usage_bytes
except TimeoutError:
pass
finally:
while cgroup.kill():
await sleep(.001)
cgroup.close()
评论列表
文章目录