[英]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.