我有三个脚本文件,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,))
然后从b
和c
内部,您可以通过以下操作发送和接收查询:
access_connection.get_query("select * from table'")
请记住,您发送给管理器进程(通过access_connection
(的所有参数以及从中接收的所有值都需要是可拾取的,这样才能工作。