python/django fork之后的SSL错误

python/django fork之后的SSL错误,python,database,django,postgresql,fork,Python,Database,Django,Postgresql,Fork,我有一个python django应用程序,其中一部分是解析一个大文件。这需要很长时间,所以我放了一个fork来处理处理过程,允许用户继续浏览站点。在fork代码中,有很多调用我们的postgres数据库,托管在amazon上 我得到以下错误: SSL error: decryption failed or bad record mac 代码如下: pid = os.fork() if pid == 0: lengthy_code_here(long) database_que

我有一个python django应用程序,其中一部分是解析一个大文件。这需要很长时间,所以我放了一个fork来处理处理过程,允许用户继续浏览站点。在fork代码中,有很多调用我们的postgres数据库,托管在amazon上

我得到以下错误:

SSL error: decryption failed or bad record mac
代码如下:

pid = os.fork()
if pid == 0:
    lengthy_code_here(long)
    database_queries(my_database)
    os._exit(0)

我的数据库调用都没有工作,尽管在我插入fork之前它们工作得很好。环顾四周后,它似乎可能是一个陈旧的数据库连接,但我不知道如何修复它。有人有什么想法吗?

在保持套接字打开(例如数据库连接)的同时进行分叉通常是不安全的,因为两个进程最终都会尝试同时使用同一个套接字

分叉后,您至少需要关闭并重新打开数据库连接


不过,理想情况下,这可能更适合于任务排队系统,如生产中的Django通常有一个进程调度到容纳Django/python的一组进程。这些进程是长时间运行的,即它们不会在处理一个请求后终止。相反,它们处理一个请求,然后处理另一个请求,然后处理另一个请求,等等。这意味着在服务请求结束时未恢复/清理的更改将影响未来的请求

分支进程时,子进程从父进程继承各种内容,包括所有打开的描述符(文件、队列、目录)。即使您对描述符不做任何操作,仍然存在一个问题,因为当一个进程死亡时,它所有打开的描述符都将被清除

因此,当您从一个长时间运行的进程分叉时,您正在设置自己在子进程完成处理后死亡时关闭所有打开的描述符(如ssl连接)。有很多方法可以防止这种情况发生在叉子上,但有时很难做到正确

更好的设计是不使用fork,而是切换到另一个正在运行或以更安全的方式启动的进程。例如:

  • at(1)可用于将作业排队,以便稍后(或立即)执行
  • 消息队列可用于将消息传递给其他守护进程
  • 标准IPC结构(如管道)可用于与其他守护进程通信
更新:


如果要使用at(1),则必须创建独立脚本。您可以使用序列化程序将数据从django传递到脚本

谢谢大家!!我现在在看芹菜,但作为一种替代方法--如何在python/django中关闭和重新打开数据库连接?
django.db.connection.close()
,我相信。可能是主线程关闭了数据库连接,而forked尝试使用相同的连接对象。长时间轮询请求时使用芹菜。哦,我已经回答了同样的问题。谢谢!你能给我举个例子,说明我如何使用at(1)将其排队以立即执行吗?