2013-12-11 33 views
1

我想用SocketIO在服務器上的特定事件發生廣播消息,現在我用這個代碼瓶和socket.io廣播

http://pastebin.com/i2jNf1w5

,我叫gevent.spawn(loop_send_queued_messages, server)啓動我的服務器

當客戶端將數據發送到「/發出」一切正常:

  • 我看到從01 broadcasting消息
  • 我看到broadcast_msg

然而broadcast_msg消息,如果在服務器的另一部分我導入broadcast功能,我用它從某個端點(例如用戶發送的文件後),我只有看到從調用broadcast第一broadcasting消息,但似乎該消息是不正確添加到隊列,因爲broadcast_msg從未被稱爲

有人能告訴我在燒瓶用戶SocketIO的最好的辦法,從廣播我的服務器代碼中的任何位置?

[編輯]考慮到下面的評論,我這個

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,和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__ 

確保相同的ID和模塊名稱顯示從服務器代碼稱爲當客戶端發送數據時調用時。

如果信息不匹配,那麼這是可能的問題。它通常是由相對進口(這是邪惡的)造成的。隨處切換到absolute imports,這可能會解決它。

使用Python 2.6或更早版本時,爲了防止這些問題,我在每個模塊的頂部添加了from __future__ import absolute_import

+0

確實這兩個隊列是不一樣的,但我認爲我只使用絕對導入('import module.submodule'而不是'import .submodule'),我如何更改導入或確保對象是共享?我以爲Python中的'import'不會重新導入文件,如果它已經被導入no? – oulipo

+0

打印了哪些模塊名稱?您的代碼相對於此模塊的佈局以及您要導入的位置是什麼?你的進口報表是什麼樣的? –

+0

請參閱我編輯的導入 – oulipo