该文章提到的 shell=False
不起作用。
简单说明:
一个可执行文件读取配置文件(非常多)在两秒内返回结果,即便修改 _work_queue
还是会因为无法关闭相应子进程导致内存溢出。
import shlex
from concurrent.futures import ThreadPoolExecutor
class BoundedThreadPoolExecutor(ThreadPoolExecutor):
def __init__(self, max_workers, max_waiting_tasks, *args, **kwargs):
super().__init__(max_workers=max_workers, *args, **kwargs)
self._work_queue = Queue(maxsize=max_waiting_tasks)
def func(conf_path):
try:
command = f"../some.exe -d -c {conf_path}"
args = shlex.split(command)
proc = subprocess.Popen(args=args, shell=False, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
stdout, stderr = proc.communicate(5)
except subprocess.TimeoutExpired:
logger.error(f"pid:{proc.pid} communicate timeout")
finally:
proc.terminate()
return proc
def callback2kill(res):
proc = res.result()
os.system(f"taskkill /F /pid {proc.pid}")
with BoundedThreadPoolExecutor(100, 500) as executor:
for endpoint in endpoints:
future = executor.submit(func, endpoint)
future.add_done_callback(callback2kill)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.