python多处理 - 初始化/传递数据库连接以跨进程使用的最佳方法

Ang*_*ela 2 python database pool initializer multiprocessing

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

我尝试过这些方法,但是我在python中得到了一个picklingerror -

游泳池地图与2个arugements

使用Initializer设置多进程池

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

这是我的代码.

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() 
Run Code Online (Sandbox Code Playgroud)

`

这会导致以下错误 -

`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`
Run Code Online (Sandbox Code Playgroud)

我猜数据库或游标对象根据python不可选,因为如果我替换repeat(db),重复(x),其中x是一个int或字符串,它可以工作.我已经尝试使用初始化函数,它似乎工作,最初但是当我执行查询时会发生奇怪的事情,当存在数据时,很多都不返回id.

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

g.d*_*d.c 7

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