Python多处理 - 使用Array(),Lock()和Pool()

时间:2017-04-12 12:23:21

标签: python multiprocessing python-multiprocessing

我一直在努力学习这个课程。

我写这个程序是为了学习如何在不同的CPU中同时运行相同的程序,并减少处理时间。

本身,程序并不复杂,只是检测不同目录中是否有一些截图,但正如我之前所说,我的最终目标不是检测这些文件,而是学习多处理。

为了更容易测试,我只是设置这些变量,而不是读取文件或读取用户输入,因此您不必输入这些内容。我会更快地以这种方式进行测试。

以下是代码:

from multiprocessing import Array, Lock, Pool

def DetectSCREENSHOT(file, counter, total): 

    # To check if this function is ever accessed
    print 'Entered in DetectSCREENSHOT function'

    if file.startswith('Screenshot') == False:

        print ' (%s %%) ERROR: the image is not a screenshot ' %(round((float(counter)/total)*100, 1))
        return 0

    else:       

        print ' (%s %%) SUCCESS: the image is a screenshot' %(round((float(counter)/total)*100, 1))
        return 1

def DetectPNG(file_list, counter_success_errors, lock):

    # To check if this function is ever accessed
    print 'Entered in DetectPNG function'

    for i in range(len(file_list)):

        file = file_list[i]

        # If the file is an .png image:

        if file.endswith('.png'):

            lock.acquire()
            counter_success_errors[0] = counter_success_errors[0] + 1
            lock.release()

            if DetectSCREENSHOT(file, counter_success_errors[0], len(file_list)) == 1:

                lock.acquire()
                counter_success_errors[1] = counter_success_errors[1] + 1
                lock.release()

            else:

                lock.acquire()
                counter_success_errors[2] = counter_success_errors[2] + 1
                lock.release()

def Main():

    # file_list = # List of lists of files in different directories
    file_list = [['A.png', 'B.png', 'C.txt', 'Screenshot_1.png'], ['D.txt', 'Screenshot_2.png', 'F.png', 'Screenshot_3.png']]

    # Array where the first cell is a counter, the second one, the number of successes and the third one, the number of errors.
    counter_success_errors = Array('i', 3)
    lock = Lock()

    counter_success_errors[0] = 0
    counter_success_errors[1] = 0
    counter_success_errors[2] = 0

    # Number of CPUS's to be used (will set the number of different processes to be run)
    # CPUs = raw_input('Number of CPUs >> ')
    CPUs = 2
    pool = Pool(processes=CPUs)

    for i in range(CPUs):
        pool.apply_async(DetectPNG, [file_list[i], counter_success_errors, lock])

    pool.close()
    pool.join()

    success = int(counter_success_errors[1])
    errors = int(counter_success_errors[2])

    print(' %s %s %s successfully. %s %s.' %('Detected', success, 'screenshot' if success == 1 else 'screenshots', errors, 'error' if errors == 1 else 'errors'))

#################################################

if __name__ == "__main__":
Main()

当我执行它时,我没有收到任何错误,但看起来它甚至都没有访问DetectPNG和DetectSCREENSHOT函数。

代码中有什么问题?

输出:Detected 0 screenshots successfully. 0 errors.

0 个答案:

没有答案