我正在尝试使用多进程池对象。我希望每个进程在启动时都打开数据库连接,然后使用该连接来处理传入的数据(而不是打开和关闭每个数据位的连接)。这似乎是初始化程序的作用因为,但我无法围绕工作人员和初始化程序如何沟通。所以我有这样的事情:如何使用初始化设置我的多进程池?
def get_cursor():
return psycopg2.connect(...).cursor()
def process_data(data):
# here I'd like to have the cursor so that I can do things with the data
if __name__ == "__main__":
pool = Pool(initializer=get_cursor, initargs=())
pool.map(process_data, get_some_data_iterator())
我怎么(或我)从get_cursor()返回光标到process_data()?
这应该是接受的答案 – thias 2014-01-15 14:12:32
@torek应该在init_worker中调用set_global_cursor吗? – 2015-06-13 07:06:51
@TheUnfunCat:不知道'init_worker'是什么(我在你的答案中看到一个,但在原始问题中没有)我不能确定地说。总的想法是允许'多进程。Pool“创建一个进程池,并让每个进程创建(它自己的私有副本)数据库连接。如果你想在池进程启动时发生这种情况,你可以使用初始化函数。如果您希望稍后发生,可以稍后再做。无论哪种方式,你需要一个持久变量,就像你的方法中的'function.cursor'或普通的'global'一样。 – torek 2015-06-14 00:40:39