Мультипроцессорная обработка хэширования - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь решить проблему майнинга в python. Учитывая строку s и целое число z, я должен найти наименьшее значение n, такое, что sha256(sha256(x)) оканчивается z нулями, где x - строка, заданная добавлением n к s. Я написал следующий код:

from hashlib import sha256
from multiprocessing import Pool

def solve(string, zeros, cores):
    with Pool(cores) as p:
        for i in range(cores):
            result = p.apply_async(sub_solve, args=(string, zeros, i, cores), callback = p.terminate)

    return result

def sub_solve(s, z, n0, cores):
    n = n0 - 1
    d = ""
    while d[:-z] != "0"*z:
        n += cores
        s1 = (s + str(n)).encode()
        h1 = sha256(s1)
        h2 = sha256(h1.digest())
        d = h2.hexdigest()
        if n % 100000 == 0:
            print("%d: %s" %(n,d))
    return n

Вызов solve с string = s, zeros = z и cores = number of cores to use он должен выполнять параллельные sub_solve вызовы в разных ядрах, где каждое должно решить проблему дляотличается n. Когда один из рабочих процессов решит проблему, весь пул должен прекратить работу. Когда я запускаю solve, я получаю такой вывод:

>>> pow.solve("asd",2,4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\user\Desktop\pow.py", line 7, in solve
    result = p.apply_async(sub_solve, args=(string, zeros, i, cores), callback = p.terminate)
  File "C:\Users\user\AppData\Local\Programs\Python\Python36-32\lib\multiprocessing\pool.py", line 355, in apply_async
    raise ValueError("Pool not running")
ValueError: Pool not running

Как я могу решить проблему?

1 Ответ

0 голосов
/ 10 октября 2019

После первой итерации пул завершается из-за обратного вызова. Итак, в следующей итерации не будет запущенного пула. Чтобы решить эту проблему, вам нужно сначала запустить цикл, а затем использовать оператор with.

т.е. заменить оператор with на цикл for, как показано ниже:

from hashlib import sha256
from multiprocessing import Pool

def solve(string, zeros, cores):
    for i in range(cores):
        with Pool(cores) as p:            
            result = p.apply_async(sub_solve, args=(string, zeros, i, cores), callback = p.terminate)

    return result

def sub_solve(s, z, n0, cores):
    n = n0 - 1
    d = ""
    while d[:-z] != "0"*z:
        n += cores
        s1 = (s + str(n)).encode()
        h1 = sha256(s1)
        h2 = sha256(h1.digest())
        d = h2.hexdigest()
        if n % 100000 == 0:
            print("%d: %s" %(n,d))
    return n
...