2013-12-11 2 views
1

Я хочу использовать SocketIO для передачи сообщений, когда определенное событие на сервере происходит, прямо сейчас я использую этот кодКолба и socket.io широковещательного

http://pastebin.com/i2jNf1w5

и я называю gevent.spawn(loop_send_queued_messages, server) при запуске моего сервера

, когда клиент посылает данные в «/ испускают» все работает отлично:

  • Я вижу broadcasting сообщений от broadcast
  • Я вижу broadcast_msg сообщений от broadcast_msg

Однако, если в другой части сервера импортировать функцию broadcast и я использую его с некоторой конечной точки (например, после того, как пользователь отправил файл), я только увидеть первое broadcasting сообщение от вызова broadcast, но мне кажется, что сообщение не правильно добавляется в очередь, потому что broadcast_msg никогда не называют

Может кто-нибудь сказать мне, что лучший способ для пользователя SocketIO в термосе, чтобы сделать вещание из любое место в моем коде сервера?

[EDIT] Принимая во внимание замечание ниже, у меня есть этот

broadcasting newDatasetAvailable features 4363892432 scripts.socket_routes 
127.0.0.1 - - [2013-12-11 15:56:07] "POST /datastore/features HTTP/1.1" 200 115 0.003130 
broadcasting msg refreshData 4363648208 socket_routes 
127.0.0.1 - - [2013-12-11 15:56:07] "POST /emit HTTP/1.1" 200 115 0.000540 
broadcast_msg msg (u'refreshData',) 

так один scripts.socket_routes, другой socket_routes

/emit конечная точка определяется в том же файле, как websocket_queue, и a POST - /datastore использует метод broadcast из другого файла и импортирует его следующим образом:

from scripts.socket_routes import broadcast 

где структура:

scripts/ 
    __init__.py 
    socket_routes.py # where websocket_queue and broadcast are defined 
    dataset_routes.py # where broadcast is imported 

ответ

0

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

Изменить шрифт в эфире(), как это:

print "broadcasting", name, data, id(websocket_queue), __name__ 

Убедитесь, что тот же идентификатор и модуль отображает имя при вызове из серверного кода, как при вызове, когда клиент отправляет данные.

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

При использовании Python 2.6 или более ранних версий я добавляю from __future__ import absolute_import в начало каждого модуля, чтобы предотвратить эти проблемы.

+0

Действительно две очереди не совпадают, но я думаю, что использую только абсолютный импорт ('import module.submodule', а не' import .submodule'), как я могу изменить свой импорт или убедиться, что объект общий? Я думал, что «import» в Python не будет переименовывать файл, если он уже был импортирован нет? – oulipo

+0

Какие имена модулей были напечатаны?Какова структура вашего кода относительно этого модуля и где вы его импортируете? Как выглядят ваши заявления импорта? –

+0

См. Мои изменения для импорта – oulipo

Смежные вопросы