#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的列表,代表一张图片。
我们希望将列表分为行和列,这样我们可以更快地浏览图片。
我们尝试了几件事:
在不加入流程的情况下:在那种情况下,只有一个功能可以工作(我们将仅获得row_q或col_q)
加入过程::程序将冻结。
我该怎么办?
答案 0 :(得分:0)
here,也回答了类似的问题
这是文档中的内容。
警告
如上所述,如果子进程已将项目放入队列中(并且 它没有使用JoinableQueue.cancel_join_thread),那么该过程 直到所有缓冲项目都已刷新到 管道。
这意味着,如果您尝试加入该过程,则可能会陷入僵局 除非您确定所有已放入队列中的项目 已被消耗。同样,如果子进程是非守护进程 那么当父进程尝试加入其所有进程时,其父进程可能会在退出时挂起 非守护儿童。
请注意,使用管理员创建的队列不存在此问题。
通过使用multiprocessing.Manager创建的队列,此问题得以解决。
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()