Форум сайта python.su
Решил сделать многопоточный подсчёт факториала.
n -число, для которого считается факториал
k - количество потоков, на которое выполняется разбиения вычисления.
Не работает для 3-х и 9-ти и более потоков! Как правило последний поток остаётся жив, при том, что тело target для процесса выполнено. Почему так?
Вот код:
from multiprocessing import Process, Queue, Value import time def fact(q,i1,i2,progr): #print ("i1=",i1," i2=",i2) m=1 for i in range(i1+1,i2+1): m=i*m progr.value=100*(i-i1)//(i2-i1) #print(progr.value) q.put(m) print("exit i1,i2",i1,i2) if __name__ == '__main__': n=35000 k=9 start_time = time.time() q = Queue() progr=[Value('d', 0.0)] * k p=[Process(target=fact,name='{}'.format(i),args=(q,n*i//k,n*(i+1)//k,progr[i],)) for i in range(k)] for x in p: x.start() #for x in p: x.join(0.1) while any(( x.is_alive() for x in p )): time.sleep(1) sum1=0 for x in progr: sum1=sum1+x.value print("progress=",sum1/k) print([(x.is_alive(),x.name) for x in p]) print([x.value for x in progr]) .... res=1 while not q.empty(): res=res*q.get() print("time=",time.time()-start_time) #print(res) ....
Отредактировано man1985 (Фев. 5, 2019 20:24:01)
Офлайн