多处理:隐藏与 fork 进程的 DB 连接

Posted

技术标签:

【中文标题】多处理:隐藏与 fork 进程的 DB 连接【英文标题】:Multiprocessing: Hiding DB connection to fork processes 【发布时间】:2021-08-14 03:15:07 【问题描述】:

尝试从方法内部派生进程,但出现以下错误:

 TypeError: can't pickle psycopg2.extensions.connection objects

当我实例化一个方法时:

res = pool.map(self.abc, data)

是的,我有一个存储在 self.db 中的数据库连接。实例化简单函数没问题

res = pool.map(abc, data)

问题是无法提取Class之外的逻辑,依赖太多了。

我的问题是:有没有办法暂时“屏蔽”self.db,所以我可以在午餐后“池”和“取消屏蔽”它,这样 pool.map() 就不会尝试腌制数据库连接

【问题讨论】:

【参考方案1】:

我能够通过全局变量和函数使其工作.. 它很丑但是...

 global SELF
 def REDIRECT(arg) : return SELF.method(arg)

 class ....:

   def blah(self):
    ...
    global SELF
    SELF = self

    with Pool(....) as pool :

       res = pool.map(REDIRECT, data)

【讨论】:

以上是关于多处理:隐藏与 fork 进程的 DB 连接的主要内容,如果未能解决你的问题,请参考以下文章

多处理 fork() 与 spawn()

Linux系统中多线程实现方法的全面解析

php 多进程

为什么多线程通常与多处理相结合?

TCP编程:多进程(fork)并发处理客户端请求

PHP多进程编程之僵尸进程问题