gpt4 book ai didi

python - 多处理 + psycopg2 僵尸 child

转载 作者:行者123 更新时间:2023-12-01 15:32:55 27 4
gpt4 key购买 nike

我正在尝试使用 psycopg 和多处理插入和更新几百万行。查看 http://initd.org/psycopg/docs/usage.html#thread-and-process-safety 中的文档,每个 child 都有自己的数据库连接。

但在执行过程中,只有一个 child 在逃跑,而其他 child 则变成了僵尸。脚本本身非常简单,这里是它的修剪版本,

import os
import psycopg2

from multiprocessing import Process


def _target(args):
# Each forked process will have its own connection
# http://initd.org/psycopg/docs/usage.html#thread-and-process-safety
conn = get_db_connection()

# Stuff seems to execute till this point in all the children
print os.getpid(), os.getppid()

# Do some updates here. After this only one child is active and running
# Others become Zombies after a while.


if __name__ == '__main__':
args = "Foo"
for i in xrange(3):
p = Process(target=_target, args=(args,))
p.start()

我还通过查看 pg_locks 检查了表是否有升级锁,但看起来并非如此。我是否遗漏了一些明显的东西?

最佳答案

您的进程变成了僵尸,因为作业已完成但进程未加入。我用这个单一测试重现了你的问题(我添加了 sleep 来模拟长时间的工作):

import os
import time
from multiprocessing import Process

def _target(args):
print os.getpid(), os.getppid()
time.sleep(2)
print os.getpid(), "will stop"

if __name__ == '__main__':
args = "Foo"
for i in xrange(3):
p = Process(target=_target, args=(args,))
p.start()
import time
time.sleep(10)

执行这个的时候,3个进程打印出他们要停止后,他们就进入了ps View (他们不再动了,但不是真的死了,因为父亲还抱着他们)。

如果我用这个替换主要部分,我就没有僵尸了:

if __name__ == '__main__':
args = "Foo"
processes = []
for i in xrange(3):
p = Process(target=_target, args=(args,))
processes.append(p)
p.start()
for p in processes:
p.join()
import time
time.sleep(10)

关于python - 多处理 + psycopg2 僵尸 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5794359/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com