簡體   English   中英

如何使用 inheritance 進行多處理?

[英]How to use multiprocessing with inheritance?

我正在嘗試通過多處理來加快腳本的運行時間。 當我嘗試使用更簡單的定義(例如在不同目錄上調整圖像大小)的相同多處理代碼時,多處理運行良好,但是當我使用下面看到的代碼嘗試它時,它運行但它沒有給出任何 output 或引發任何錯誤,我是想知道這可能是什么原因。

我還想知道如何使用這段代碼進行多處理,也許 inheritance 是問題所在?

class Skeleton:
    def __init__(self, path, **kwargs):

        if type(path) is str:
                self.path = path
                self.inputStack = loadStack(self.path).astype(bool)
        if kwargs != {}:
            aspectRatio = kwargs["aspectRatio"]
            self.inputStack = ndimage.interpolation.zoom(self.inputStack, zoom=aspectRatio, order=2, 
            prefilter=False)

    def setThinningOutput(self, mode="reflect"):
        # Thinning output
        self.skeletonStack = get_thinned(self.inputStack, mode)
    def setNetworkGraph(self, findSkeleton=False):
        # Network graph of the crowded region removed output
        self.skeletonStack = self.inputStack
        self.graph = get_networkx_graph_from_array(self.skeletonStack)

    def setPrunedSkeletonOutput(self):
        # Prune unnecessary segments in crowded regions removed skeleton
        self.setNetworkGraph(findSkeleton=True)
        self.outputStack = pr.getPrunedSkeleton(self.skeletonStack, self.graph)
        saveStack(self.outputStack, self.path + "pruned/")


class Trabeculae (Skeleton):
    pass

def TrabeculaeY (path):
     path_mrb01_square = Trabeculae(path)
     path_mrb01_square.setPrunedSkeletonOutput()

if __name__=='__main__':

    path1 = (r' ')
    path2 = (r' ')
    path3 = (r' ')
    the_list =[]
    the_list.append(path1)
    the_list.append(path2)
    the_list.append(path3)
    for i in range (0,len(the_list)):
        p1 = multiprocessing.Process(target=TrabeculaeY, args=(the_list[i],))
        p1.start()
        p1.join()

Inheritance 對於多處理來說不是問題。

您不能join()循環內的進程。 這意味着循環一直等到p1完成它的工作,然后再繼續下一個。

相反,在一個循環中啟動所有進程,然后在第二個循環中等待所有進程,如下所示:

if __name__=='__main__':

    path1 = (r' ')
    path2 = (r' ')
    path3 = (r' ')
    the_list =[]
    the_list.append(path1)
    the_list.append(path2)
    the_list.append(path3)
    started_processes = []
    for i in range (0,len(the_list)):
        p1 = multiprocessing.Process(target=TrabeculaeY, args=(the_list[i],))
        p1.start()
        started_processes.append(p1)
    for p in started_processes:
        p.join()  

我用於測試的完整代碼:

import multiprocessing


class Skeleton:
    def __init__(self, path, **kwargs):
        self.path = path
        pass

    def setThinningOutput(self, mode="reflect"):
        pass

    def setNetworkGraph(self, findSkeleton=False):
        pass

    def setPrunedSkeletonOutput(self):
        print(self.path)


class Trabeculae(Skeleton):
    pass


def TrabeculaeY(path:str):
    path_mrb01_square = Trabeculae(path)
    path_mrb01_square.setPrunedSkeletonOutput()


if __name__ == '__main__':
    the_list = [r'1', r'2', r'3']
    started_processes = []
    for path in the_list:
        process = multiprocessing.Process(target=TrabeculaeY, args=path)
        process.start()
        started_processes.append(process)

    for process in started_processes:
        process.join()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM