2009-06-07 4 views
1

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

Существует wxreactor, доступный в скрученном виде, но googling показывает, что с ним было множество проблем с момента его появления в библиотеке. Даже тот, кто изначально придумал технику wxreactor, advocates running wx and twisted in separate threads.

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

ответ

0

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

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

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

0

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

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