2013-05-30 22:25:42 +02:00
import shared
import time
from multiprocessing import Pool , cpu_count
import hashlib
from struct import unpack , pack
2013-05-29 22:01:12 +02:00
def _pool_worker ( nonce , initialHash , target , pool_size ) :
trialValue = 99999999999999999999
while trialValue > target :
2013-05-30 22:25:42 +02:00
nonce + = pool_size
trialValue , = unpack ( ' >Q ' , hashlib . sha512 ( hashlib . sha512 ( pack ( ' >Q ' , nonce ) + initialHash ) . digest ( ) ) . digest ( ) [ 0 : 8 ] )
2013-05-29 22:01:12 +02:00
return [ trialValue , nonce ]
def run ( target , initialHash ) :
try :
2013-05-30 22:25:42 +02:00
pool_size = cpu_count ( )
2013-05-29 22:01:12 +02:00
except :
2013-05-30 22:25:42 +02:00
pool_size = 4
try :
maxCores = config . getint ( ' bitmessagesettings ' , ' maxcores ' )
except :
maxCores = 99999
if pool_size > maxCores :
pool_size = maxCores
2013-05-29 22:01:12 +02:00
pool = Pool ( processes = pool_size )
result = [ ]
for i in range ( pool_size ) :
2013-05-30 22:25:42 +02:00
result . append ( pool . apply_async ( _pool_worker , args = ( i , initialHash , target , pool_size ) ) )
2013-05-29 22:01:12 +02:00
while True :
2013-05-30 22:42:24 +02:00
if shared . shutdown :
pool . terminate ( )
time . sleep ( 5 ) #Don't return anything (doing so will cause exceptions because we'll return an unusable response). Sit here and wait for this thread to close.
return
2013-05-30 22:25:42 +02:00
for i in range ( pool_size ) :
if result [ i ] . ready ( ) :
result = result [ i ] . get ( )
pool . terminate ( )
return result [ 0 ] , result [ 1 ]
time . sleep ( 0.2 )
2013-05-29 22:01:12 +02:00