2013-10-06 18 views
1

我想運行一個zeroRPC服務器作爲greenlet與其他gevent greenlet在同一個循環中。 ZeroRPC的文檔有點亮。 這是啓動zeroRPC服務器建議的方式:如何運行zerorpc作爲greenlet?

s = zerorpc.Server(Cooler()) 
s.bind("tcp://0.0.0.0:4242") 
s.run() 

要運行該服務器作爲greenlet,我裹在greenlet運行:

s = zerorpc.Server(Cooler()) 
s.bind("tcp://0.0.0.0:4242") 
gevent.spawn(s.run) 

# More code and greenlets started. 
# ... 

但似乎有點尷尬,考慮到zeroRPC已經基於gevent,並且gevent框架中的其他服務器具有非阻塞啓動方法。

有沒有更好的方法來做到這一點?

回答

0

這是最好的辦法。

.run()方法將負責設置(zerorpc)服務器,根據需要產生和管理任何子greenlet。這有效地創建了一個greenlet樹,將任何致命錯誤冒泡回到.run()方法。 zerorpc服務器將在一個新的greenlet中運行任何傳入的請求,這是從.run()方法擁有的greenlet樹中產生的。

通過使用阻塞.run()方法,您可以使用簡單的try/catch處理由.run()引發的錯誤。此外,當.run()返回時,這意味着zerorpc服務器已完全停止。例如,當您從另一個greenlet調用.stop()時,zerorpc服務器將停止接受新請求並完成處理活動請求,然後再從.run()返回。()

相關問題