python - 使用join()后如何在执行过程中终止进程?
问题描述
我想在执行过程中杀死某个进程或所有进程。我的示例代码如下。我怎样才能做到这一点?在这里,我想根据当前时间终止进程。如果时间可以被 2 整除,我想终止进程,否则不会。
import time
from multiprocessing import Process
def runTests(a, b):
time.sleep(10)
return a + b
def main(kill_processes):
print(kill_processes)
processes = []
for i in range(3):
print(i)
proc = Process(target=runTests, args=(2, 4,))
processes.append(proc)
proc.start()
for proc in processes:
proc.join()
if kill_processes:
print("killing")
proc.terminate()
if __name__ == "__main__":
if round(time.time()) % 2 == 0:
main(True)
else:
main(False)
解决方案
这说明了如何通过以类似于我建议您查看的问题multiprocessing in stoppable multithreading的答案中的方式使用多个线程来做到这一点。
基本上,所有的join()
调用都是在单独的线程中完成的,所以它们不会阻塞主进程中的主线程——这使得它可以杀死它们。
import threading
import time
from multiprocessing import Process
def runTests(a, b):
time.sleep(10)
return a + b
def create_process(lock, i):
proc = Process(target=runTests, args=(2, 4,))
print(f'{proc.name} created')
proc.start()
with lock:
processes.append(proc)
proc.join()
def main(kill_processes):
global processes
N = 3
lock = threading.RLock()
processes = []
print(f'main({kill_processes=})')
for i in range(N):
thread = threading.Thread(target=create_process, args=(lock, i))
thread.start()
while True: # Wait for all processes to have been created.
with lock:
if len(processes) == N:
break
else:
time.sleep(.001)
if kill_processes:
print("Killing the processes")
for proc in processes:
proc.terminate()
print(f'process {proc} terminated')
if __name__ == "__main__":
main(True)
# if round(time.time()) % 2 == 0:
# main(True)
# else:
# main(False)
推荐阅读
- apache-kafka - 架构注册表只读副本
- rabbitmq - RabbitMQ 在 Debian 上从 3.8.2 升级到 3.8.6 -- 如何安装最新版本?
- reactjs - 如何将 HTML 元素传递给反应组件?
- c++ - if(x % y == 0) 导致我的程序不输出任何东西?
- python - Python index/lineno 用于使用检查调用 expr 的 ast
- reactive-programming - 具有多个数据库(MySQL、MongoDB)的反应式全局事务
- javascript - wordpress ajax 请求为超过 1mb 的数据返回 'POST .../wp-admin/admin-ajax.php net::ERR_CONNECTION_CLOSED'
- docker - 在 VS Code 中连接到远程 Docker 容器
- c# - 如何在 Visual Studio 代码中的多个项目之间包含共享类
- scala - 如何在 GCP 中获取存储桶中的对象列表?