Методы экземпляра, вызываемые в отдельном потоке, чем поток экземпляров - PullRequest
1 голос
/ 07 июня 2009

Я пытаюсь обернуть голову вокруг того, что происходит в этом рецепте , потому что я планирую реализовать приложение wx / twisted, подобное этому (т.е. wx и twisted, работающие в отдельных потоках ). Я понимаю, что и витые, и wx-циклы событий должны быть доступны потокобезопасным способом (т. Е. Реактор.callFromThread, wx.PostEvent и т. Д.). То, что я подвергаю сомнению, является безопасностью потока передачи в экземплярах методов объектов, созданных в одном потоке (в случае этого рецепта, потока GUI) как отложенные методы callBack и errBack для реактора, работающего в отдельном потоке. Это хорошая идея?

Существует wxreactor, доступный в витой форме, но поиск в Google показывает, что с момента его появления в библиотеке возникли многочисленные проблемы с ним. Даже человек, который изначально придумал технику wxreactor, выступает за запуск wx и скручивание в отдельных потоках .

Мне не удалось найти других примеров этой техники, но я бы хотел увидеть некоторые из них.

Ответы [ 2 ]

0 голосов
/ 17 июня 2009

Я бы не сказал, что это "хорошая идея". Вы должны просто запустить реактор и графический интерфейс в одном потоке с wxreactor.

Описанный г-ном Шредером подход, основанный на таймере управляемой петли событий, является наихудшим из возможных отказоустойчивых способов реализации интеграции петли событий. Если вы используете wxreactor (не wxsupport), Twisted теперь использует подход, при котором мультиплексирование отключается внутри потока, так что ничто не требует использования таймера. Еще лучше было бы, чтобы wxpython выставил wxSocket и попросил кого-нибудь основать на нем реактор.

Однако, если вы настроены на использование отдельного потока для связи с Twisted, следует помнить, что вы можете использовать объекты, которые происходят из любого потока, в качестве значения, передаваемого Deferred.callback Вы должны звонить Deferred.callback только в самом потоке реактора. Отсроченные не потокобезопасны; благодаря некоторым утилитам отладки, даже Deferred класс не является поточно-ориентированным, поэтому вы должны быть очень осторожны, когда используете их, чтобы никогда не покидать основной поток Twisted. т.е. когда у вас есть результат в потоке пользовательского интерфейса, используйте reactor.callFromThread(myDeferred.callback, myresult).

0 голосов
/ 08 июня 2009

Единственный акт передачи методов экземпляра между потоками безопасен, если вы правильно синхронизируете возможное уничтожение этих экземпляров (потоки разделяют память, поэтому действительно не имеет значения, какой из них выполнил / инициализировал ее часть).

Общая безопасность потоков зависит от того, что на самом деле делают эти методы, поэтому просто заставьте их «играть хорошо», и все будет в порядке.

...