Python 使用多处理池更新django模型会锁定数据库

Python 使用多处理池更新django模型会锁定数据库,python,django,postgresql,multiprocessing,jupyter-notebook,Python,Django,Postgresql,Multiprocessing,Jupyter Notebook,我使用Jupyter笔记本来处理我存储在django/postgres中的数据。我以以下方式初始化项目: sys.path.append('/srv/gr/prg') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'prg.settings') if 'setup' in dir(django): django.setup() 有许多单独的进程更新数据,我想多线程处理它以加快进程。当我在单个线程中进行更新或使用sqlite时,一切都很好

我使用Jupyter笔记本来处理我存储在django/postgres中的数据。我以以下方式初始化项目:

sys.path.append('/srv/gr/prg')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'prg.settings')
if 'setup' in dir(django):
    django.setup()
有许多单独的进程更新数据,我想多线程处理它以加快进程。当我在单个线程中进行更新或使用
sqlite
时,一切都很好

def extract_org_description(id):
    o = models.Organization.objects.get(pk=id)
    logging.info("Looking for description for %s" % o.symbol)
    try:
        content = open('/srv/data/%s.html' % o.symbol)
    except FileNotFoundError:
        logging.error("HTML file not found for %s" % o.symbol)
        return
    doc = BeautifulSoup(content, 'html.parser')
    desc = doc.select("#cr_description_mod > div.cr_expandBox > div.cr_description_full.cr_expand")
    if not desc or not desc[0]:
        logging.info("Cannot not find description for %s" % o.symbol)
        return
    o.description = desc[0].text
    o.save(update_fields=['description'])
    logging.info("Description for %s found" % o.symbol)
    return("done %s" % id)
这是行不通的:

p = Pool(2)
result = p.map(extract_org_description, orgs)
print(result)
大多数时候,它会一直挂起,直到我中断它为止,没有任何特别的错误,有时postgres会出现“已经有一个事务在进行中”,有时我会看到“没有要获取的结果”错误。根据池的大小,我可以让它工作一次或两次,但很难诊断到底是什么问题

我尝试将策略更改为选择对象,并将它们映射到将对象作为参数的
提取组织描述
(不同于基于键进行选择),但这没有更好的效果


我唯一的想法是,当django尝试自动提交时,所有单独的更新(包括在其他线程中发生的更新)都在相同的事务范围内,这导致了问题。但是我不明白如何在django中解决这个问题。

你的问题包括多处理和多线程,但重要的是要理解这些是实现并发的不同方式

Django内置了对多线程的支持,并将继续。如果您从多处理切换到多线程,您的问题应该得到解决

在多处理中,整个进程是分叉的,新进程将具有与旧进程相同的数据库连接。这会导致您看到的问题,例如,您试图打开一个新事务,而另一个进程已经在同一数据库连接上打开了一个事务

如果您确实需要多处理而不是多线程,可能有一些解决方案。例如,建议只关闭数据库连接,强制Django创建新的连接