Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 22, 2010 20:50:44

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

обработка исключений

Наконец появилось время разобраться с этим кодом.

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

И ещё один вопрос - max_workers это максимальное кол-во потоков?



Офлайн

#2 Ноя. 22, 2010 21:07:29

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

обработка исключений

max_workers - да, максимальное количество потоков.

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

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



Офлайн

#3 Ноя. 22, 2010 22:02:17

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

обработка исключений

Спасибо за разъяснения.
Настолько глубоко я конечно его ещё не понимаю, никогда не работал с многопоточностью.

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

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

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

Тогда непонятно, что мы собственно отменяем через p.cancel() ?



Офлайн

#4 Ноя. 22, 2010 22:55:11

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

обработка исключений

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

Если у нас на три потока сто заданий, и при этом окно закрывается - лучше быстро отменить всё, что не успело начать обрабатываться - иначе ждать долго придется. pending существует только для того, чтобы знать, кто еще не обработался, но в очередь уже поставлен.



Офлайн

#5 Ноя. 23, 2010 16:57:37

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

обработка исключений

спасибо за подробные объяснения!
вроде всё понятно, премного благодарен.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version