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

时间:2018-07-02 11:27:14

标签: python multiprocessing

#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. 加入过程::程序将冻结。

我该怎么办?

1 个答案:

答案 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()