不能在大队列上使用加入多处理-Python


#Each pic's size is 1280x720 
import time
from multiprocessing import Process,JoinableQueue,Queue,Value
**def create_row(M, q_row,y_val):**    #creating lines. len:720 len of each     
line_len=720
col_len=1280
for i in range(line_len):
q_row.put(M[(i*col_len):((i+1)*col_len)])

**def create_col(M, q_col,x_val):** #creating cols
col_len=1280  
line_len=720
for i in range(col_len): 
l = list() 
for j in range(line_len):
l.append(M[j*line_len + i])    
q_col.put(l)
**def main():**
#creating row and col Queue
q_row=JoinableQueue()
q_col=JoinableQueue()
x_val=Value('i',-1)
y_val=Value('i',-1)
p1=Process(target=create_row,args=(M,q_row,y_val))
p2=Process(target=create_col,args=(M,q_col,x_val))
q_row.join()
q_col.join()
p1.start()
p2.start()
p1.join()
p2.join()

现在到问题:
M是一个大小为1280*720的列表,代表一张图片。
我们希望将列表划分为行和列,以便我们可以更快地浏览图片。
我们尝试了几件事:

  1. 不加入进程:在这种情况下,只有一个函数可以工作(我们将只得到row_q或col_q(

  2. 加入进程::程序将冻结。

我该怎么办?

类似的问题已经在这里得到了回答,

这是文档中的一些内容。

警告

如上所述,如果子进程已将项目放入队列(并且 它没有使用JoinableQueue.cancel_join_thread(,那么这个过程 在所有缓冲项刷新到 管。

这意味着,如果您尝试加入该进程,您可能会遇到死锁 除非您确定所有已放入队列的项目 已被消耗。同样,如果子进程是非守护进程 然后,当父进程尝试加入其所有进程时,它可能会在退出时挂起 非守护进程子项。

请注意,使用管理器创建的队列不存在此问题。

使用多处理创建的队列。经理,此问题已解决。

import time
from multiprocessing import Process,JoinableQueue,Queue,Value
import multiprocessing
def create_row( q_row,y_val): #creating lines. len:720 len of each
line_len=720
for i in range(line_len):
q_row.put(1)
def create_col(q_col,x_val): #creating cols
col_len=1280
line_len=720
for i in range(col_len):
l = list()
for j in range(line_len):
l.append(1)
q_col.put(l)
def main():
#creating row and col Queue
manager = multiprocessing.Manager()
q_row=manager.JoinableQueue()
q_col=manager.JoinableQueue()
x_val=Value('i',-1)
y_val=Value('i',-1)
p1=Process(target=create_row,args=(q_row,y_val))
p2=Process(target=create_col,args=(q_col,x_val))
q_row.join()
q_col.join()
p1.start()
p2.start()

p1.join()
p2.join()
main()

相关内容

  • 没有找到相关文章