tag:blogger.com,1999:blog-824928856526666223.post7392214892451328376..comments2022-11-30T10:25:30.656+02:00Comments on Андрей Светлов: GIL и обработка сигналовAndrew Svetlovhttp://www.blogger.com/profile/08716418137388253439noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-824928856526666223.post-18277171722420284912013-05-07T17:38:42.872+03:002013-05-07T17:38:42.872+03:00Дмитрий, браво!
Если join() вызывается с таймауто...Дмитрий, браво!<br /><br />Если join() вызывается с таймаутом, то вызов ожидает установки condition variable self.__block.<br /><br />В двойке lock не поддерживал timeout. Поэтому __block.wait() в цикле пытался захватить lock и если не получалось уходил в sleep. Максимальная задержка для sleep 0.05 сек, что не очень много.<br /><br />В результате хакерский способ работает, пусть и несколько прожорливо для CPU.Andrew Svetlovhttps://www.blogger.com/profile/08716418137388253439noreply@blogger.comtag:blogger.com,1999:blog-824928856526666223.post-64194482313285114042013-05-07T17:15:02.048+03:002013-05-07T17:15:02.048+03:00Я в 2.x эту проблему решал установкой таймаута (не...Я в 2.x эту проблему решал установкой таймаута (не важно какого - главное не очень маленького) на join():<br />while thread.isAlive(): thread.join(float(24 * 60 * 60))<br /><br />Честно говоря, в исходники не смотрел, но как только join() вызывается с каким-либо таймаутом, он начинает вести себя так, как нужно.Anonymoushttps://www.blogger.com/profile/15691414798569690025noreply@blogger.comtag:blogger.com,1999:blog-824928856526666223.post-4569964922260360922011-07-05T11:02:39.312+03:002011-07-05T11:02:39.312+03:00>> Сергей Гуляев
Извините, я не припомню как...>> Сергей Гуляев<br />Извините, я не припомню какого-то особого способа для обработки сигналов именно в wxPython. Использовал стандартные механизмы Питона, и всё работало.Andrew Svetlovhttps://www.blogger.com/profile/08716418137388253439noreply@blogger.comtag:blogger.com,1999:blog-824928856526666223.post-63358505806685157532011-07-05T10:58:59.583+03:002011-07-05T10:58:59.583+03:00>> andreynikishaev
Как, по вашему, происходи...>> andreynikishaev<br />Как, по вашему, происходит обработка сигналов в 2.7? <br />Тоже на самом деле непрозрачно, с переключением потока и так далее. Да вот беда — локи были дурные, мешали. Теперь не мешают, схема стала работать во всех случаях так, как и предполагалось изначально.Andrew Svetlovhttps://www.blogger.com/profile/08716418137388253439noreply@blogger.comtag:blogger.com,1999:blog-824928856526666223.post-30899683564178302182011-07-05T09:26:55.224+03:002011-07-05T09:26:55.224+03:002 Андрей Светлов:
Ну если меняется поток выполнени...2 Андрей Светлов:<br />Ну если меняется поток выполнения, то я бы не сказал что лок остается локом, так как по сути в этот момент он игнорится и идет переключение.<br />Я говорю о том что любая не прозрачная операция в коде это не очень гуд. Я к примеру привык знать что, где и когда у меня в коде выполняется.<br /><br />Представим например что есть участок программы, который имеет наивысший приоритет и не должен останавливать свое выполнение. Если остановкой для обработки сигнала управляем мы - то все ок. А вот если им управляет система - то получаем проблему.<br /><br />Я не спорю в питоне 3.2 хендлинг сигналов выходит проще, но я бы не сказал что лучше.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-824928856526666223.post-73947173878630758272011-07-05T07:12:39.292+03:002011-07-05T07:12:39.292+03:00Приходилось сталкиваться с потоками в wxPython и т...Приходилось сталкиваться с потоками в wxPython и там обработка сигналов реализована с помощью Pubsub, подойдет ли он в данном случае?Anonymoushttps://www.blogger.com/profile/13022903143661081275noreply@blogger.comtag:blogger.com,1999:blog-824928856526666223.post-54137346826563175062011-07-05T00:34:21.309+03:002011-07-05T00:34:21.309+03:00Простите, возможно, я вас не понял.
В 3.2 лок не ...Простите, возможно, я вас не понял. <br />В 3.2 лок не снимается — он остается за тем потоком, который его держит. Но вот попытка взять лок, прерванная сигналом, дает возможность получить управление главному потоку ОС.<br />В котором Питон, не снимая блокировки с ожидающего, даст выполнить обработчик сигнала.<br />Это будет сделано в главном потоке — да.<br />Но с точки зрения внутренних структур питона — в отдельном контексте, никак не затрагивающем главный поток. Я не вижу никакого пересечения обработчика сигнала с потоком, выполняющим свое дело.<br />Если считаете, что это нужно отдельно подчеркнуть — с удовольствием внесу поправку. Только подскажите, пожалуйста, как именно эта поправка должна звучать.Andrew Svetlovhttps://www.blogger.com/profile/08716418137388253439noreply@blogger.comtag:blogger.com,1999:blog-824928856526666223.post-80064543967673713752011-07-05T00:16:05.740+03:002011-07-05T00:16:05.740+03:00Вообще это не совсем правильно перекладывать проце...Вообще это не совсем правильно перекладывать процесс выбора хода выполнения программы на то что не контролируется самой программой(питон3.2 не прав).<br />Если есть лок, то он должен быть до тех пор пока его не снимут, иначе могут возникнуть ситуации когда такое переключение, сделает из уже довольно сложной структуры программы, еще более сложную.<br /><br />По моему опыту важные вещи должны быть явными.Anonymousnoreply@blogger.com