Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 5, 2019 20:23:10

man1985
Зарегистрирован: 2018-08-14
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Многопоточность с помощью класса Process

Решил сделать многопоточный подсчёт факториала.
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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version