- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我针对这个问题提出了一个问题,但没有得到足够彻底的答案来解决这个问题(很可能是因为我在解释我的问题时不够严谨,而这正是我试图纠正的):Zombie process in python multiprocessing daemon
我正在尝试实现一个 python 守护进程,它使用一个工作池来使用 Popen
执行命令。我从http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/借来了基本的守护进程
我只更改了 init
、daemonize
(或者同样是 start
)和 stop
方法。以下是对 init
方法的更改:
def __init__(self, pidfile):
#, stdin='/dev/null', stdout='STDOUT', stderr='STDOUT'):
#self.stdin = stdin
#self.stdout = stdout
#self.stderr = stderr
self.pidfile = pidfile
self.pool = Pool(processes=4)
我没有设置 stdin、stdout 和 stderr,以便我可以使用 print 语句调试代码。此外,我曾尝试将此池移动到几个地方,但这是唯一不会产生异常的地方。
以下是对 daemonize
方法的更改:
def daemonize(self):
...
# redirect standard file descriptors
#sys.stdout.flush()
#sys.stderr.flush()
#si = open(self.stdin, 'r')
#so = open(self.stdout, 'a+')
#se = open(self.stderr, 'a+', 0)
#os.dup2(si.fileno(), sys.stdin.fileno())
#os.dup2(so.fileno(), sys.stdout.fileno())
#os.dup2(se.fileno(), sys.stderr.fileno())
print self.pool
...
同样,我没有重定向 io 以便我可以调试。使用此处的打印,以便我可以检查池位置。
并且 stop
方法发生了变化:
def stop(self):
...
# Try killing the daemon process
try:
print self.pool
print "closing pool"
self.pool.close()
print "joining pool"
self.pool.join()
print "set pool to None"
self.pool = None
while 1:
print "kill process"
os.kill(pid, SIGTERM)
...
这里的想法是,我不仅需要终止进程,还需要清理池。 self.pool = None
只是随机尝试解决 Unresolved 问题。起初我以为这是僵尸 child 的问题,当我在 while 中有 self.pool.close()
和 self.pool.join()
时发生使用 os.kill(pid, SIGTERM)
循环。这是在我决定开始通过 print self.pool
查看池位置之前。这样做之后,我相信当守护进程启动和停止时池是不一样的。这是一些输出:
me@pc:~/pyCode/jobQueue$ sudo ./jobQueue.py start
<multiprocessing.pool.Pool object at 0x1c543d0>
me@pc:~/pyCode/jobQueue$ sudo ./jobQueue.py stop
<multiprocessing.pool.Pool object at 0x1fb7450>
closing pool
joining pool
set pool to None
kill process
kill process
... [ stuck in infinite loop]
物体的不同位置向我暗示它们不是同一个池,其中一个可能是僵尸?
在 CTRL+C
之后,这是我从 ps aux|grep jobQueue
得到的结果:
root 21161 0.0 0.0 50384 5220 ? Ss 22:59 0:00 /usr/bin/python ./jobQueue.py start
root 21162 0.0 0.0 0 0 ? Z 22:59 0:00 [jobQueue.py] <defunct>
me 21320 0.0 0.0 7624 940 pts/0 S+ 23:00 0:00 grep --color=auto jobQueue
我尝试将 self.pool = Pool(processes=4)
移动到许多不同的地方。如果它被移动到 start()' 或
daemonize() 方法,
print self.pool` 将抛出一个异常,表明它是 NoneType。此外,位置似乎改变了将弹出的僵尸进程的数量。
目前,我还没有添加通过 workers 运行任何东西的功能。我的问题似乎与正确设置 worker 池完全相关。如果有任何有助于解决此问题的信息或有关创建守护进程服务的建议,我将不胜感激,该守护进程服务使用工作池来使用 Popen
执行一系列命令。由于我还没有走到那一步,我不知道我面临的挑战是什么。我在想我可能只需要编写自己的池,但如果有一个很好的技巧让池在这里工作,那就太棒了。
最佳答案
解决方法是将self.pool = Pool(process=4)
放在daemonize
方法的最后一行。否则池最终会在某处丢失(可能在 fork
中)。然后可以在 run
方法中访问该池,该方法由您希望守护的应用程序重载。但是,不能在 stop 方法中访问池,这样做会导致 NoneType 异常。我相信有一个更优雅的解决方案,但这是有效的,这是我现在所拥有的。如果我希望 stop
在池仍在运行时失败,我将不得不向 run
添加额外的功能和某种形式的消息,但我目前不关心这个。
关于守护进程内的Python多处理池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6516508/
最近,我们将专用 SQL 池部署到生产中的 Synapse 工作区。在开发中,我们可以访问无服务器 SQL 池和专用 SQL 池。但是,在生产中,我们可以访问无服务器 SQL 池,但无法访问专用 SQ
假设您从一个项目公开 WCF 服务,并使用“添加服务引用”(在本例中为 Framework 3.5 WPF 应用程序)在另一个项目中使用它。 当您重新实例化 ClientBase 派生代理时,Clie
我有一个函数,它使用 multiprocessing.Pool 并行处理一个数据集中的所有数据。 from multiprocessing import Pool ... def func():
我正在尝试使用进程对象在 python 中使用工作池。每个 worker (一个进程)进行一些初始化(花费大量时间),传递一系列作业(理想情况下使用 map()),并返回一些东西。除此之外,不需要任何
我是软件工程师,最近我构建了我的 Linux 机器,想探索更多系统管理员类型的任务。我已经探索并阅读了很多关于 ZFS 的内容,但我越来越困惑,因为每篇文章对它的描述都不一样。 Everything
我有 zfs 池: $ sudo zpool status lxd pool: lxd state: ONLINE scan: none requested config: NAME
我有一个基于 Actor 的项目,对于其中的一部分,我必须使用一些接收消息的 Actor ,然后一个 Actor 分别分配给每个请求,每个 Actor 负责执行其消息请求,所以我需要类似线程的东西我的
我已经使用 QEMU 模拟器成功地将 FreeBSD 安装到原始图像文件中。我已经使用 ZFS 文件系统 (ZFS POOL) 格式化了图像文件。 使用下面的命令我已经成功地挂载了准备好由 zpool
我正在使用 multiprocessor.Pool并行处理一些文件。该代码等待接收文件,然后使用 Pool.apply_async 将该文件发送给工作人员。 ,然后处理文件。 这段代码应该一直在运行,
我正在使用带有光滑的 Bonecp 数据源。并发现池包含关闭的连接所以我总是遇到这个异常 java.sql.SQLException: Connection is closed! at com
我有apartment gem的 Multi-Tenancy Rails应用程序,我可以使用apartment-sidekiq在每个工作程序中成功切换数据库租户。但是,sidekiq worker 正
ZFS 池可能由数据集(文件系统、快照等)或卷组成。 ZFS 卷就像 block 设备,但我不明白池和文件系统之间的区别。当我通过 zpool create pool1 sda sdb sdc 创建
我在 docker 容器上运行了 airflow。我正在使用 airflow 2.0.2 版。 我知道我实际上可以通过 UI 创建池。但我正在寻找一种通过 pools.json 文件在 docker
我在tomcat中有一个jdbc池,用于建立数据库连接。我在使用后没有显式关闭连接对象。我的“maxActive”参数设置为100。应用程序运行了一段时间,但随后失败进行数据库查询。它会等待无限时间来
阅读 PostgreSQL 文档 here我读了以下内容: As well, connections requested for users other than the default config
我在 docker 容器上运行了 airflow。我正在使用 airflow 2.0.2 版。 我知道我实际上可以通过 UI 创建池。但我正在寻找一种通过 pools.json 文件在 docker
我正在读取一个大的 URL 文件并向服务发出请求。该请求由返回 ListenableFuture 的客户端执行。现在我想保留一个 ListenableFuture 池,例如最多同时执行 N 个 Fut
我想使用队列来保存结果,因为我希望消费者(串行而不是并行)在工作人员产生结果时处理工作人员的结果。 现在,我想知道为什么以下程序挂起。 import multiprocessing as mp imp
我正在开发一个单页应用程序,目前正在构建一个 JQuery、ajax 函数,以便我的所有调用都能通过。 对于一个典型的页面,我可能有 3 个 ajax 调用。我的想法是,如果用户互联网出去将这些 aj
我有一个单位类及其一些子类(弓箭手、剑客等)。我怎样才能创建一个回收所有单元类型子类的池? 最佳答案 这是不可能的,因为池只能包含一种特定类型的对象。否则你可能会遇到这样的情况: Pool unitP
我是一名优秀的程序员,十分优秀!