我试图减少读取大约 100,000 个条目的数据库的处理时间,但我需要它们以特定的方式格式化,为了尝试做到这一点,我尝试使用 pythonmultiprocessing.map
函数工作完美,只是我似乎无法获得任何形式的队列引用来跨它们工作。
我一直在使用来自在 python 中填充队列并管理多处理 https://stackoverflow.com/questions/17241663/filling-a-queue-and-managing-multiprocessing-in-python指导我跨多个进程使用队列,以及在线程中使用全局变量 https://stackoverflow.com/questions/19790570/using-a-global-variable-with-a-thread指导我跨线程使用全局变量。我已经让软件可以工作了,但是当我在运行该过程后检查列表/队列/字典/映射长度时,它总是返回零
我写了一个简单的例子来说明我的意思:
您必须将脚本作为文件运行,map
's initialize
函数在解释器中不起作用。
from multiprocessing import Pool
from collections import deque
global_q = deque()
def my_init(q):
global global_q
global_q = q
q.append("Hello world")
def map_fn(i):
global global_q
global_q.append(i)
if __name__ == "__main__":
with Pool(3, my_init, (global_q,)) as pool:
pool.map(map_fn, range(3))
for p in range(len(global_q)):
print(global_q.pop())
理论上,当我使用以下方法将队列对象引用从主线程传递到工作线程时pool
函数,然后使用给定函数初始化该线程的全局变量,然后当我从map
函数之后,该对象引用应该仍然指向原始队列对象引用(长话短说,所有东西都应该在同一个队列中结束,因为它们都指向内存中的相同位置)。
所以,我期望:
Hello World
Hello World
Hello World
1
2
3
当然,1, 2, 3
的顺序是任意的,但是您将在输出中看到的是''
.
为什么当我将对象引用传递给pool
函数,什么也没发生?