- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这段代码
import asyncio
from aiohttp import web
from multiprocessing import Process
import time
def block():
i = 0
while i < 5:
print('running')
time.sleep(1)
i += 1
async def start(request):
process = Process(target=block)
process.start()
print('process started')
request.app['p'] = process
return web.Response(status=200)
async def stop(request):
if request.app['p'].is_alive():
print('stop process')
request.app['p'].terminate()
return web.Response(status=200)
app = web.Application()
app.router.add_route('GET', '/start', start)
app.router.add_route('GET', '/stop', stop)
web.run_app(app, host='127.0.0.1', port=8888)
当我在 /start
上发送 HTTP GET 时,我可以看到 running
每秒都像预期的那样在终端上输出。但是,当我在 /stop
上发送 HTTP GET 时,running
流在循环完成之前不会停止。此外,当循环结束时,整个应用程序就死掉了。
这是一个输出:
❯ python3 server.py
======== Running on http://127.0.0.1:8888 ========
(Press CTRL+C to quit)
process started
running
running
running
stop process
running
running
❯
有趣的是,这个请求处理程序确实可以在不停止整个应用程序的情况下工作。
async def stop2(request):
if request.app['p'].is_alive():
print('stop2 process')
os.kill(request.app['p'].pid, signal.SIGKILL)
return web.Response(status=200)
那么在 python/aiohttp 中使用 os.kill
和 process.terminate
有什么区别?
最佳答案
区别在于terminate()
发送SIGTERM
信号,而kill()
发送您指定的信号。
默认情况下,Aiohttp 会在启动时为 SIGTERM
和 SIGINT
注册处理程序,以便正常关闭。在生产环境中,您通常不会在控制台中运行您的应用程序(因此您不能使用 Ctrl+C 禁用它),而是使用一些进程主管,如 Systemd 或 Docker。要停止此类应用程序,主管通常会发送 SIGTERM
。您可以使用 arg handle_signals=False
禁用默认处理程序到 run_app()
调用,但是当您决定关闭服务器时,这些信号中的任何一个都会被立即杀死。
当您在 UNIX 上使用 multiprocessing
模块时,您的子进程是通过 fork()
调用创建的 - 这意味着,在创建时,它几乎是主进程的完整副本- 它有一个父信号处理程序的副本。使用 subprocess
模块有助于实现这一点——您将拥有全新的 python 进程,无需父处理程序。或者你可以只恢复默认处理程序,如果你将这些行添加到 block()
调用的开头:
signal.set_wakeup_fd(-1)
signal.signal(signal.SIGTERM, signal.SIG_DFL)
通常,信号仅由一个进程使用(您在 kill()
中指定其 pid)。但是使用 aiohttp 会发生一些神奇的事情。 asyncio
的底层实现使用signal.set_wakeup_fd()
函数来处理信号,将信号写入套接字。这使得信号只是异步事件循环的标准事件。但这是您的应用程序中断的地方。不仅你的工作进程没有停止(因为 aiohttp 中断了信号)。由于套接字是在 fork()
调用之前创建的,因此它在您的主进程和所有子进程之间共享。因此,您的子进程的任何 SIGTERM
和 SIGINT
信号都将由主进程处理。在 /stop
请求之后,您的网络服务器已经死了——甚至在循环结束之前。
关于python-3.x - os.kill 与 process.terminate 在 aiohttp 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50781181/
一个观察:当我在 android 上开发我的应用程序时,我注意到 LogCat 中有以下两行。这些发生是因为我自己的应用程序的内存需求太多。我读过 Android 可以决定何时摆脱不需要或由于内存需求
SIGINT有什么区别信号和 SIGTERM信号?我知道SIGINT相当于在键盘上按Ctrl+C,但什么是SIGTERM为了?如果我想优雅地停止一些后台进程,我应该使用哪些? 最佳答案 响应的唯一区别
假设我有一个父进程和一个子进程(以例如 fork() 或 clone() 启动)在 Linux 上运行。进一步假设存在一些父子都可以修改的共享内存。 在父进程的上下文中,我想停止子进程并知道它实际上已
所以我最近了解到 kill is not a synchronous命令,所以我在 bash 中使用这个 while 循环,这很棒: while kill PID_OF_THE_PROCESS 2>/
我遇到了一个问题。我们有一个干净的脚本用来清理旧文件,有时我们需要停止它,稍后再启动它。像下面的过程。我们在check.sh中使用kill -STOP $pid和kill -CONT $pid来控制c
内核中谁负责终止进程。 如果“kill”来了,进程处于阻塞状态怎么办。 kill是否等到进程进入running状态才清理自己。 如果有人可以在内核方面回答更多问题,例如当 kill 命令生成 SIGI
在下面的链接中 http://www.faqs.org/docs/Linux-HOWTO/NFS-HOWTO.html 它说一个进程除非被“sure kill”才能杀死,但是什么是sure kill?
我正在尝试编写一个快速的 bash 脚本,以在脚本检测到的特定条件下向程序发出信号,并且出于习惯,我正在使用某些 bin 实用程序的完整路径,即 /bin/rm 和 /bin/kill 代替 rm 和
我的服务器在端口 80 上运行 nohup。我试试 ps aux | grep nohup 得到 root 9234 0.0 0.1 11740 932 pts/1 S+ 15:19 0:00 gre
我写了下面的脚本,如果 grep 在文件中找不到相关的字符串,它会启用 20 秒的超时。 脚本运行良好,但是脚本的输出是这样的: ./test: line 11: 30039: Killed 如何从
基本上我想要一个 bash 脚本进程,在收到 SIGINT 后,在退出之前杀死它的所有子进程。我读了here使用以下内容: trap "kill -TERM -$$ ; exit 1" INT QUI
我有一个名为 Launcher.sh 的 shell 脚本,它由 java 进程执行。 java进程内部使用ProcessBuilder来执行bash脚本。 在 Launcher.sh 中,我有以下代
上下文 我创建了一个调用 celery 任务的 Django 应用程序,该任务又会生成其他任务并等待它们完成。 工作流程如下: 1) 主要的python/django代码在后台启动一个celery任务
我要输出这条消息/usr/local/ex1.sh: line xxx: Killed ex2.sh >> $LOG_FILE 2>&1到日志文件。 不过 “ex1.sh”输出 /usr/local
我最近上传了很多问题,我认为人们对我感到厌倦,但我不擅长编程,并且正在尝试为 A-level 类(class)编写游戏代码,所以我需要所有可以得到的帮助来学习语言。不管怎样,我将在下面展示一些相关的代
hadoop job -kill job_id 和 yarn application -kill application_id 有什么区别? job_id 和 application_id 是否代表/
在我的 post-command-hook回调,当我这样做时 kill-word , this-command var 是 kill-region - 而不是 kill-word正如预期的那样。 我想
我有一个要在 Oracle Linux OS 上运行的 C++ 应用程序。 考虑一下,我用 new 创建了几个对象。运算符(operator)。虽然我已经使用 delete 操作符来解除分配它,但是
不确定是否相关,但在周末我将我的操作系统升级到 Big Sur 11.1 版,然后当我开始工作时,一件又一件地出错,现在我根本无法使用 node 或 npm。我在 zsh 中收到以下消息: % nod
我使用 python 并行启动两个子进程。一个是 HTTP 服务器,而另一个是另一个程序的执行(CustomSimpleHTTPServer.py,它是由 selenium IDE 插件生成的 pyt
我是一名优秀的程序员,十分优秀!