Python在独立进程之间共享对象



我有三个脚本文件,a.py、b.py和c.py。a.py用于启动b.py和c.py。

我在a.py中有一个SQL/SQLite/SQLcipher连接。我正在寻找一种与b/c.py共享该连接的方法,这样每个人都可以向a.py发送一个查询,a.py返回结果。

我一直在研究套接字和多处理shared_memory,但两者似乎都需要一个大小,根据查询的不同,可以是几kb到100+Mb。

那么,是否可以共享内存地址和大小,以便在不同的shell中运行的第二个python进程可以访问该内存/对象?

快速示例伪代码:

b.py -> memory.query("select * from table'") -> a.py
a.py -> q(memory.query): memory.results= cur.exe(memory.query) -> b.py 
b.py -> print(memory.results)

您可以在此处使用管理器。但是,不是在a.py中创建sql连接,而是在单独的管理器进程中创建连接,并且允许通过代理访问该对象。这里有一个例子:

from multiprocessing import Process, BaseManager
from c import main_c
from b import main_b

class AccessConnection:
def __init__(self, connection):
self.connection = connection
def get_query(self, query):
return self.connection.get_query(query)
# You can include other possible functions you want to allow processes to access
def create_my_sql_connection(*args, **kwargs):
connection = None  # Initialize your SQL connection
return AccessConnection(connection)
if __name__ == "__main__":
BaseManager.register("create_my_sql_connection", create_my_sql_connection)
manager = BaseManager.start()
access_connection = manager.create_my_sql_connection()  # Create and store your connection in another process
# Start a and b
proc_b = Process(main_b, args=(access_connection, ))
proc_c = Process(main_c, args=(access_connection,))

然后从bc内部,您可以通过以下操作发送和接收查询:

access_connection.get_query("select * from table'")

请记住,您发送给管理器进程(通过access_connection(的所有参数以及从中接收的所有值都需要是可拾取的,这样才能工作。

最新更新