mysql连接器位于单独的python进程中,无法在构造函数/\uu init中pickle__

mysql连接器位于单独的python进程中,无法在构造函数/\uu init中pickle__,python,mysql,multithreading,multiprocessing,pickle,Python,Mysql,Multithreading,Multiprocessing,Pickle,我想将一些SQL db处理(当接收到某些项时,会编写一个批处理)放在python中的一个单独进程中(目前我有一个主线程,它生成另一个回调句柄线程来处理另一个读线程从internet接收到的数据—感兴趣的读线程IB TWS API) app.run()(源自EWrapper,EClient)包含: ... now = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f") conId = self.contract

我想将一些SQL db处理(当接收到某些项时,会编写一个批处理)放在python中的一个单独进程中(目前我有一个主线程,它生成另一个回调句柄线程来处理另一个读线程从internet接收到的数据—感兴趣的读线程IB TWS API)

app.run()(源自EWrapper,EClient)包含:

    ...
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
    conId = self.contractList[reqId].conId

    # send tuple to the other process
    item = (conId, now, price, tickType)
    self.tasks.put(item)
    ...
run()的一部分,是数据处理线程的一部分,从主线程开始,例如

  thread_app = threading.Thread(target=app.run)
  thread_app.start()
这是主线:

def main():
  app = BasicApp() 
  app.connect("127.0.0.1", 7497, 0)

  tasks = multiprocessing.JoinableQueue()

  sqlTickSaver = sqlExecutor(tasks)

  sqlTickSaver.start()

  app.tasks = tasks
  ...
运行时,它会给出“TypeError:cannot pickle”SSLSocket“object”。但是我在别处读到一些建议,我应该将mysql连接器完全放在进程本身/构造函数中(据我所知,我是这样做的)。此外,我只通过队列发送元组(根据Python的文档,我应该能够对该类型进行pickle/序列化)


解决办法是什么?当在init中省略mysql内容时,会出现错误(但其他一些内容出错,因此我猜它与mysql连接器有关)。

当我移动self.conn=。。。和self.cursor=。。。在def run(self)中的while True:(while True:)之前:它似乎有效。如果有人建议我为什么不能在进程的构造函数中创建mysql连接?我很好奇,不知怎的,进程的构造函数不喜欢在其中使用这些mysql.connector.connect相关的东西。一个普通类确实接受它。我认为mysql对象必须在init期间以某种方式进行pickle,但在run()方法中不会。我发现构造函数在主进程中运行,所以当它尝试在start()中生成/复制进程时,它会启动_popen/run(),无法pickle/transfer的sql对象出现问题。我假设在run()中创建all时,sql连接是在子流程本身中创建的,因此不需要复制/引用它。这是我目前的理论。一些信息
def main():
  app = BasicApp() 
  app.connect("127.0.0.1", 7497, 0)

  tasks = multiprocessing.JoinableQueue()

  sqlTickSaver = sqlExecutor(tasks)

  sqlTickSaver.start()

  app.tasks = tasks
  ...