Найти - Пользователи
Полная версия: обработка исключений
Начало » Python для новичков » обработка исключений
1 2
Игнат
Наконец появилось время разобраться с этим кодом.

Потестил, переписал для лучшего понимания и появился вопрос - какая необходимость в функции closeEvent() ? Если убрать её из кода - всё работает точно также.

И ещё один вопрос - max_workers это максимальное кол-во потоков?
Андрей Светлов
max_workers - да, максимальное количество потоков.

closeEvent необходим.
Многопоточные программы - довольно запутанная штука. Если делать неправильно - может работать в большинстве случаев, лишь иногда по какому-то странному стечению обстоятельств ведя себя “странно”.

Итак, при завершении программы нужно дождаться окончания работы executor. Иначе Питон будет ждать их сам - что не очень красиво и совершенно неконтролируемо. Перед этим стоит отменить все задания, которые еще не начали работать. Если задания считаются долго - полезно добавить возможность их аварийного завершения. Последнее выходит за рамки concurency.futures, придется делать самому.
Игнат
Спасибо за разъяснения.
Настолько глубоко я конечно его ещё не понимаю, никогда не работал с многопоточностью.

Но непонятно когда вызывается closeEvent. Пробовал поставить в нём print(), так принт так и не попал в консоль.

В процессе работы, каждый помещенный в pending объект Future из него удаляется, после чего вызывается Future.result()
Таким образом, если потоков было меньше чем заданий - оставшиеся задания отменяются с помощью p.cancel() – я правильно понимаю?

С другой стороны потоки по логике должны бы разбирать все задания, пока те не закончатся, ведь для того они и запущены.
И 3 потока должны разобрать 9 или 100 заданий.

Тогда непонятно, что мы собственно отменяем через p.cancel() ?
Андрей Светлов
closeEvent вызывается, когда окно закрывается.
В плюсовом девичестве это - виртуальная функция, подписываться не нужно.
http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qwidget.html#closeEvent
Можно рисовать progress bar или еще что, если закрытие долгое.
Или, как в доке, запросить подтверждение.

Если у нас на три потока сто заданий, и при этом окно закрывается - лучше быстро отменить всё, что не успело начать обрабатываться - иначе ждать долго придется. pending существует только для того, чтобы знать, кто еще не обработался, но в очередь уже поставлен.
Игнат
спасибо за подробные объяснения!
вроде всё понятно, премного благодарен.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB