【问题标题】:python multiprocessing - Best way to initialize/pass database connection to be used across processespython multiprocessing - 初始化/传递数据库连接以跨进程使用的最佳方法
【发布时间】:2012-09-27 04:33:57
【问题描述】:

我在使用 Python 多处理包中的 pool.map 传递数据库连接对象或游标对象时遇到了一些困难。基本上,我想创建一个工人池,每个工人都有自己的状态和数据库连接,以便他们可以并行执行查询。

我已经尝试过这些方法,但我在 python 中遇到了酸洗错误 -

Pool Map with 2 arugements

Use Initializer to set up multiprocess pool

第二个链接正是我需要做的,这意味着我希望每个进程在启动时打开一个数据库连接,然后使用该连接来处理传入的数据/参数。

这是我的代码。

import multiprocessing as mp

def process_data((id,db)):
  print 'in processdata'
  cursor = db.cursor()
  query = ....
  #cursor.execute(query)
  #....
  .....
  .....
  return row

`if __name__ == '__main__':

  db = getConnection() 
  cursor = db.cursor() 
  print 'Initialised db connection and cursor'
  inputs = [1,2,3,4,5]
  pool = mp.Pool(processes=2)
  result_list = pool.map(process_data,zip(inputs,repeat(db)))
  #print result_list
  pool.close()
  pool.join() 

`

这会导致以下错误 -

`Exception in thread Thread-1:
  Traceback (most recent call last):
  File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.6/threading.py", line 484, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib/python2.6/multiprocessing/pool.py", line 225, in _handle_tasks
    put(task)
  PicklingError: Can't pickle <type 'module'>: attribute lookup __builtin__.module failed`

我猜 db 或 cursor 对象根据 python 是不可挑选的,因为如果我将 repeat(db) 替换为 repeat(x) 其中 x 是 int 或 string ,它就可以工作。我尝试使用初始化函数,它似乎可以工作,但最初执行查询时会发生奇怪的事情,当有数据存在时,许多 id 没有返回任何内容。

实现这一目标的最佳方法是什么?我在 linux 机器上使用 python 2.6.6。

【问题讨论】:

  • 你……可能不想传递数据库连接。它们不可序列化。如果您的孩子需要访问数据库,他们可能需要建立自己的连接。

标签: python database multiprocessing pool initializer


【解决方案1】:

我将继续提出我的评论作为答案,因为我认为它是合适的。您不想尝试将数据库连接从父进程传递到子进程。您希望将可以序列化的静态数据或其他对象移动到您的子进程。您可以传递数据行等。或者您希望您的孩子在必要时建立自己的数据库连接。

【讨论】:

    【解决方案2】:

    尝试酸洗数据库连接对象。酸洗独立于工艺。所以它可能会起作用..

    参考这些页面 - python pickle
    pickle examples

    【讨论】:

    • pickle 通常会在传入数据库连接时抛出一个合适的状态(我已经发生了很多次,你需要将它从保存状态中取出)所以这似乎是一个不明智的选择。
    猜你喜欢
    • 1970-01-01
    • 2021-11-13
    • 2014-12-12
    • 1970-01-01
    • 2018-03-09
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多