2014-01-17 21 views
1

我的安裝程序有一個生成的Node.js子代,它創建了一個Python對象的2路ZeroRPC會話對。Python客戶端調用中的雙向ZeroRPC導致AssertionError

Python端與此類似:

class MyClass: 
    def __init__(self, socketpath): 
     self.client = zerorpc.Client() 
     self.client.connect(socketpath) 

    def sendtoclient(self, msg): 
     self.client.receiveMessage(msg) 

if __name__ == '__main__': 
    zpc = zerorpc.Server(MyClass(sys.argv[1])) 
    zpc.bind(sys.argv[1] + "_python") 
    zpc.run() 

Node.js的子客戶端可以調用Python的服務器上的方法,但該服務器中的客戶端不能沒有得到Node.js的孩子服務器上調用例外:

Traceback (most recent call last): 
File "/usr/lib64/python2.6/site-packages/gevent/queue.py", line 271, in _unlock getter.switch(getter) 

File "/usr/lib64/python2.6/site-packages/gevent/hub.py", line 534, in switch assert getcurrent() is self.hub, "Can only use Waiter.switch method from the Hub greenlet" 

AssertionError: Can only use Waiter.switch method from the Hub greenlet 
<callback at 0x3055e90 args=()> failed with AssertionError 

是否在Python類需要客戶端生成爲一個GEVENT,然後在需要時,其receiveMessage方法調用?還是有一些我可以忽略的其他技巧?

回答

2

經過一番實驗,一個可行的解決方案來自Gevent的文檔中的一些例子。我使用的解決方案是創建一個從服務器端填充的gevent Queue,並從一個單獨的Greenlet循環輸出。所以,我的服務器中的文件,我說:

import gevent 
from gevent.queue import Queue, Empty 

messagesOut = Queue() 
def clientWorker(address): 
    client = zerorpc.Client() 
    if (None != client): 
     client.connect(address) 
     while True: 
      try: 
       messages = messagesOut.get() 
       client.passMessages(messages) # a method on the Node.js-side ZeroRPC server 
      except: # Empty could be thrown here if you're interested 
       pass 
      finally: 
       gevent.sleep(0) 

MyClass,它的初始化改爲保留作爲self.outbox(事實上,我可以用全球每一次我訪問)隊列的引用。當需要發送異步消息時,MyClass調用self.outbox.put(messages)

然後樓下的創建ZeroRPC實例時,我產生了每個:

if __name__ == '__main__': 
    ge_client = gevent.spawn(clientWorker, sys.argv[1] + "_node2python") 
    zpc = zerorpc.Server(messagesOut) 
    zpc.bind(sys.argv[1] + "_python2node") 
    ge_server = gevent.spawn(zpc.run) 
    gevent.joinall([ge_client, ge_server]) # up and running here. 

做上述解決我的問題,作爲一個驗證的概念。

相關問題