2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 134

Multiprocessing и тормозящий поток

16.08.2016, 02:29. Показов 1330. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Написал маленькую прогу которая выполняет расчеты и в конце пишет результаты в эксель.
Встала проблема: при помощи модуля multiprocessing запускаю количество потоков равное количеству доступных ядер процессора. Однако 1 - 2 потока тормозятся и судя по выводу в процентах в консоль того на сколько каждый процесс выполнился, выполняются ровно столько же сколько выполнялись подавляющее большинство потоков до них(него). То есть имеем 8 ядер, 6 потоков выполнились, завершили свою работу, а два только начали выполняться. Пробовал уменьшить количеств потоков на два(8 ядер проца, 6 потоков), эффект тот же.В чем может быть проблема?
Спасибо!!!

Добавлено через 36 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 StartTime = time.clock()
 
        Ticks = []
 
        for line in open('ticks.txt'):
            Ticks.append(float(line))
 
        worker_count = cpu_count()
        print ("worker_count",worker_count)
        print("worker_count-2", worker_count-1)
 
        Steps =  (EndInaquality - StartInaquality)//(worker_count-1)
        IncrementStepValue = (EndInaquality - StartInaquality)//(worker_count-1)
        print("IncrementStepValue:",IncrementStepValue)
 
        tmpStartValueLWMA1 = StartValueLWMA1
        tmpStartValueLWMA2 = StartValueLWMA2
        tmpStartInaquality = StartInaquality
        tmpEndInaquality = tmpStartInaquality + IncrementStepValue
 
        num = 0
        jobs = []
        for i in range(worker_count-1):
 
            p = Process(target=Calculate, args=(num,StartTime,Stats,Ticks,Steps,tmpStartValueLWMA1,StartValueLWMA1,
                    EndValueLWMA1,tmpStartValueLWMA2,StartValueLWMA2,EndValueLWMA2,tmpStartInaquality,tmpEndInaquality))
            jobs.append(p)
            p.start()
            num += 1
            tmpStartInaquality += IncrementStepValue
            print("tmpStartInaquality += IncrementStepValue:",tmpStartInaquality)
            if(tmpEndInaquality > EndInaquality):
                tmpEndInaquality = EndInaquality
                print("tmpEndInaquality = EndInaquality:",tmpEndInaquality)
            else:
                tmpEndInaquality += IncrementStepValue
                print("tmpEndInaquality += IncrementStepValue:",tmpEndInaquality)
 
 
            print (p)
 
        for w in jobs:
            w.join()
            print (w)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.08.2016, 02:29
Ответы с готовыми решениями:

Multiprocessing Queue vs multiprocessing.Manager Queue
Если кому интересно: обычная Queue из мультитпроцессинга имеет ограничение по размеру, если туда забивать объекты не считывая. а очередь из...

Определить тормозящий момент
Маховик представляющий собой диск массой m=10кг и радиусом R=10 см ,свободно вращается вокруг оси,которая проходит через центр ,с круговой...

Определить тормозящий момент
Диск радиусом 20 см и массой 8 кг вращался с частотой 10с^(-1) . При торможении он остановился, сделав пять полных оборотов. Определить...

2
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
16.06.2019, 07:49
Не выводить ничего в консоль, тогда процессы не будут лочиться.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
16.06.2019, 14:52
Цитата Сообщение от akhimik Посмотреть сообщение
запускаю количество потоков равное количеству доступных ядер процессор
Процессов, а не потоков.
-------------------------------------------
Для однотипных задач с разными аргументами куда удобнее использовать dask - фреймворк для вычислительных задач.
У него очень многофункциональное API.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import math
import dask
from dask import compute, delayed
import dask.multiprocessing
import os
 
def func(i):
    #print("[ProcessID %d] Task for row %d" % (os.getpid(), i))
    res = math.factorial(i) # задача имитирующая длительное вычисление
    return res # какой-то результат вычисления, который мы возвращаем
    
 
if __name__ == "__main__":    
    import time
    n_tasks = 10000
    
    # обычный с последовательным выполнением кода  single-threaded
    start = time.time()
    # создаем список n_tasks однотипных задач
    values = [delayed(func)(x) for x in range(n_tasks)]
    results = compute(*values, scheduler='single-threaded')
    #print(results)
    print('ELAPSED single-thread:', time.time() - start) 
    #------------------------------------------------------------
    input("Нажмите для продолжения")
    #------------------------------------------------------------
    
    # многопроцессный вариант - используются все ядра по умолчанию
    start = time.time()
    # создаем список n_tasks однотипных задач
    values = [delayed(func)(x) for x in range(n_tasks)]
    results = compute(*values, scheduler='processes')
    #print(results)
    print('ELAPSED processes:', time.time() - start) 
    
    #------------------------------------------------------------
    input("Нажмите для продолжения")
    #------------------------------------------------------------
 
    # многопоточный вариант - не дает никаких преимуществ для вычислений так как GIL
    start = time.time()
    # создаем список n_tasks однотипных задач
    values = [delayed(func)(x) for x in range(n_tasks)]
    results = compute(*values, scheduler='threads')
    #print(results)
    print('ELAPSED threads:', time.time() - start)
Вывод:
Code
1
2
3
4
5
ELAPSED single-thread: 74.13518571853638
Нажмите для продолжения
ELAPSED processes: 28.941655158996582
Нажмите для продолжения
ELAPSED threads: 75.84733819961548
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.06.2019, 14:52
Помогаю со студенческими работами здесь

Найти тормозящий момент
Квадратная рамка, состоящая из четырех тонких стержней длиной 20 см и массой 50 г каждый, вращается относительно оси, проходящей через...

Определить тормозящий момент
Маховик представляющий собой диск массой m=10кг и радиусом R=10 см ,свободно вращается вокруг оси,которая проходит через центр ,с круговой...

Определить тормозящий момент
Кинетическая энергия вращающегося маховика 1,5 кДж. Под действием постоянного тормозящего момента маховик начал вращаться равнозамедленно...

Определить силу и тормозящий момент
Помогите,пожалуйста решите 4)Сплошной шар массой 1,0 кг и радиусом 5,0 см вращается вокруг оси, проходящей через его центр. Закон...

Призапуске системы тормозящий процесс
При запуске системы, система Win7X64, спустя определенное время, компьютер начинает подтормаживать. В диспетчере задач появляется некий...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru