簡體   English   中英

主進程完成后,Python 多處理需要很長時間才能完成

[英]Python multiprocessing takes too long to complete after main process has finished

我試圖讓自己熟悉多處理,所以我使用蠻力搜索來查找字符串。

該腳本按預期工作,並且由於使用了迭代器 RAM 使用情況非常好。 我不明白的是在找到“密碼”之后發生了什么。 腳本退出總是需要雙倍的時間(在本例中,查找密碼需要 70 秒,完成需要 160 秒),據我所知,它唯一需要做的就是終止所有進程。

這是正在發生的事情還是有其他事情?

import itertools
import multiprocessing as mp
import string
import time

# start timer
tStart = time.time()

userPass = 'mypass'

def getPassword(passList):
    str = ''.join(passList)
    if userPass == str:
        print('\n')
        print('~~~ CRACKED ~~~')
        print('User password is {}'.format(str))
        print('Cracked password in {:.3f} seconds'.format(time.time() - tStart))

if __name__ == '__main__':
    # possible characters used in password
    chars = list(string.ascii_lowercase)    

    # get all character combinations
    allPasswords = itertools.product(chars, repeat=len(userPass))

    # calculate optimum chunk number
    totalComb = len(chars) ** len(userPass)
    nChunks = int(max(1, divmod(totalComb, mp.cpu_count() * 4)[0]))

    with mp.Pool(processes=mp.cpu_count()) as pool:
        for result in pool.imap_unordered(getPassword, allPasswords, chunksize=nChunks):
            if result == userPass:
                pool.terminate()
                break
            del result # trying to reduce memory usage
    tEnd = time.time()
    tElapsed = tEnd - tStart

    print('Total elapsed time {:.3f} seconds'.format(tElapsed))

讓您的getPassword函數返回字符串(至少在成功的情況下)。 現在它總是返回默認的None ,所以result == userPass永遠不會是真的並且pool.terminate()永遠不會被執行。

此外,您可能希望使用更小的chunksize

暫無
暫無

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

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