将进程中的连接对象传递给python中的主进程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将进程中的连接对象传递给python中的主进程相关的知识,希望对你有一定的参考价值。

我有一个应用程序,可以按需创建数据库连接。但我想要一个功能,如果创建连接需要超过一定的时间,它应该超时。所以我使用multiprocess,生成一个进程,并在一段时间后加入它,并检查进程的状态。此过程运行良好,但我无法从生成的进程中检索连接对象,因为它不可序列化。有帮助吗?

import psycopg2
import multiprocessing
from multiprocessing import Process

config = 
    "user": "xxx",
    "password": "xxx",
    "host": "xxx",
    "database": "xxx",



def create_postgres_connection(config, return_dict):
    # Connect to the database, we have to timeout this function if it takes too long.
    host = config['host']
    database = config['database']
    username = config['user']
    password = config['password']
    connection = psycopg2.connect(host=host, database=database, user=username, password=password)
    return_dict['connection'] = connection


def run_with_limited_time(func, args, kwargs, time):
    """Runs a function with time limit

    :param func: The function to run
    :param args: The functions args, given as tuple
    :param kwargs: The functions keywords, given as dict
    :param time: The time limit in seconds
    :return: True if the function ended successfully. False if it was terminated.
    """
    p = Process(target=func, args=args, kwargs=kwargs)
    p.start()
    p.join(5)
    if p.is_alive():
        p.terminate()
        print('Timed Out')
        return False
    return True


if __name__ == '__main__':
    manager = multiprocessing.Manager()
    return_dict = manager.dict()
    run_with_limited_time(create_postgres_connection, (config, return_dict), , 3)
    print(return_dict)
答案

您将无法使用多处理执行此操作,因为它依赖于Pickling一个对象以便在进程之间传输它。正如您所发现的那样,连接对象无法被腌制。

但是,我认为你无论如何都不需要这样做,因为Postgres在连接时允许使用connect_timeout参数,这实际上是你需要解决的问题。 connect_timeout以秒为单位指定。 [postgres docs]

根据psycopg2 docs,您可以将任何特定于数据库的参数作为关键字参数传递。

它看起来像:

def create_postgres_connection(config, connection):
    # Connect to the database
    host = config['host']
    database = config['database']
    username = config['user']
    password = config['password']
    connection = psycopg2.connect(host=host, database=database, user=username, 
                                  password=password, connect_timeout=3)
    return connection

以上是关于将进程中的连接对象传递给python中的主进程的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给进程

将 unicode 参数传递给 ShellExecuteEx 中的子进程

如何将参数传递给 Python 模块中的主函数?

将参数传递给nodejs中的子进程,这些参数在execFile方法中具有一些依赖性

使用 Python 将包含双引号的参数传递给子进程

TCL/Expect 相当于 Bash $@ 或如何将参数传递给 TCL/Expect 中的衍生进程