Многопроцессорная обработка Python (TypeError: невозможно сериализовать объект '_io.BufferedReader') - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь осуществить словарную атаку на zip-файл, используя Pool для увеличения скорости. Но я сталкиваюсь с следующей ошибкой в ​​Python 3.6, пока она работает в Python 2.7:

Traceback (most recent call last):
File "zip_crack.py", line 42, in <module>
main()
File "zip_crack.py", line 28, in main
for result in results:
File "/usr/lib/python3.6/multiprocessing/pool.py", line 761, in next
raise value
File "/usr/lib/python3.6/multiprocessing/pool.py", line 450, in               _   handle_tasks
put(task)
File "/usr/lib/python3.6/multiprocessing/connection.py", line 206, in send
self._send_bytes(_ForkingPickler.dumps(obj))
File "/usr/lib/python3.6/multiprocessing/reduction.py", line 51, in dumps
cls(buf, protocol).dump(obj)
TypeError: cannot serialize '_io.BufferedReader' object

Я пытался найти те же ошибки, но не смог найти ответ, который может помочь здесь.

Код выглядит так

def crack(pwd, f):
   try:
       key = pwd.strip()
       f.extractall(pwd=key)
       return True
   except:
       pass

  z_file = zipfile.ZipFile("../folder.zip")

with open('words.dic', 'r') as passes:
    start = time.time()

    lines = passes.readlines()

    pool = Pool(50)

    results = pool.imap_unordered(partial(crack, f=z_file), lines)
    pool.close()

    for result in results:
        if result:
            pool.terminate()
            break
    pool.join()

Я также попробовал другой подход, используя карту

with contextlib.closing(Pool(50)) as pool:

        pool.map(partial(crack, f=z_file), lines)

, который отлично работал и быстро находил пароли в Python 2.7, но выдает то же исключение в Python 3.6

...