我正在尝试使用psycopg和多处理来插入和更新几百万行。根据http://initd.org/psycopg/docs/usage.html#thread-and-process-safety中找到的文档,每个子节点都有自己的与数据库的连接。
但是在处决过程中,只有一个孩子奔跑,其他孩子变成了僵尸。该脚本本身非常简单,这是该脚本的修剪版本,
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
来检查表是否具有升级的锁,但是看起来情况并非如此。我是否缺少明显的东西? 最佳答案
您的流程成为僵尸,因为那里的工作已经完成,但流程没有加入。
我通过此测试重现了您的问题(我添加了睡眠以模拟长时间工作):
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视图(它们不再移动,但并没有真正死掉,因为父亲仍然持有它们)。
如果我用这个替换主要部分,则不再有僵尸:
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/