我是多道处理的新手,无论我尝试了什么,我都一事无成。每次我想我发现了什么,我就遇到了新的障碍。我的目标是使用多个进程加载队列,然后使用多个进程从队列中提取数据并处理数据。我已经尝试恢复到基本的队列处理,但一旦实现了多个进程,就无法从队列中获得任何东西。我错过了什么
rom multiprocessing import Process, Lock
from queue import Queue
import os
q = Queue(5)
def get_from_q():
print('trying to get')
print(q.get())
if __name__ == '__main__':
# put items at the end of the queue
for x in range(6):
print('adding ', x)
q.put(x)
PROCESSOR_COUNT = os.cpu_count()
processes = []
for p in range(PROCESSOR_COUNT):
print('spawning process')
p = Process(target=get_from_q)
processes.append(p)
for p in processes:
print('starting')
p.start()
for p in processes:
print('joining')
p.join()
adding 0
adding 1
adding 2
adding 3
adding 4
adding 5
adding 0
adding 1
adding 2
adding 3
adding 4
adding 5
spawning process
spawning process
spawning process
spawning processv
starting
starting
starting
starting
trying to get
0
trying to get
1
trying to get
2
trying to get
3
trying to get
4
trying to get
5
joining
joining
joining
joining
如果您在使用
spawn
创建新进程的平台下运行,那么在创建新进程时,将不会继承主进程的地址空间,而是通过重新执行程序顶部的所有代码来初始化新的地址空间。这意味着您在全局范围内定义的任何内容都将重新执行,例如在您的代码中:这意味着此代码由您创建的每个进程执行,这意味着每个进程都有自己的副本
q
。这是行不通的。您需要创建一次q
,并将其作为参数传递。我还向print
函数添加了flush=True,以减少不同进程的输出被交错的可能性印刷品:
使用进程池
此处,队列由池实现隐藏:
印刷品:
相关问题 更多 >
编程相关推荐