Форум сайта python.su
0
Наконец появилось время разобраться с этим кодом.
Потестил, переписал для лучшего понимания и появился вопрос - какая необходимость в функции closeEvent() ? Если убрать её из кода - всё работает точно также.
И ещё один вопрос - max_workers это максимальное кол-во потоков?
Офлайн
14
max_workers - да, максимальное количество потоков.
closeEvent необходим.
Многопоточные программы - довольно запутанная штука. Если делать неправильно - может работать в большинстве случаев, лишь иногда по какому-то странному стечению обстоятельств ведя себя “странно”.
Итак, при завершении программы нужно дождаться окончания работы executor. Иначе Питон будет ждать их сам - что не очень красиво и совершенно неконтролируемо. Перед этим стоит отменить все задания, которые еще не начали работать. Если задания считаются долго - полезно добавить возможность их аварийного завершения. Последнее выходит за рамки concurency.futures, придется делать самому.
Офлайн
0
Спасибо за разъяснения.
Настолько глубоко я конечно его ещё не понимаю, никогда не работал с многопоточностью.
Но непонятно когда вызывается closeEvent. Пробовал поставить в нём print(), так принт так и не попал в консоль.
В процессе работы, каждый помещенный в pending объект Future из него удаляется, после чего вызывается Future.result()
Таким образом, если потоков было меньше чем заданий - оставшиеся задания отменяются с помощью p.cancel() – я правильно понимаю?
С другой стороны потоки по логике должны бы разбирать все задания, пока те не закончатся, ведь для того они и запущены.
И 3 потока должны разобрать 9 или 100 заданий.
Тогда непонятно, что мы собственно отменяем через p.cancel() ?
Офлайн
14
closeEvent вызывается, когда окно закрывается.
В плюсовом девичестве это - виртуальная функция, подписываться не нужно.
http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qwidget.html#closeEvent
Можно рисовать progress bar или еще что, если закрытие долгое.
Или, как в доке, запросить подтверждение.
Если у нас на три потока сто заданий, и при этом окно закрывается - лучше быстро отменить всё, что не успело начать обрабатываться - иначе ждать долго придется. pending существует только для того, чтобы знать, кто еще не обработался, но в очередь уже поставлен.
Офлайн
0
спасибо за подробные объяснения!
вроде всё понятно, премного благодарен.
Офлайн