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

2024-10-01 13:44:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经为这个项目挣扎了一段时间了。在

我写这个程序是为了学习如何在不同的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.


Tags: oftheinlockifpngiscounter