python - Pyro4 Tutorial, Error on different machines: not enough data -
i started use pyro4 yesterday, i'm experimenting tutorial code official document. ran locally, encountered problems when adapt these examples in different machines, specifically, stockmarket example. here adapted code on server , client.
==== server side ====
stockmarket.py
from __future__ import print_function import random import threading import time import pyro4 class stockmarket(object): def __init__(self, marketname, symbols): self.name = marketname self.symbolmeans = {} symbol in symbols: self.symbolmeans[symbol] = random.uniform(20, 200) self.aggregators = [] def generate(self): quotes = {} symbol, mean in self.symbolmeans.items(): if random.random() < 0.2: quotes[symbol] = round(random.normalvariate(mean, 20), 2) print("new quotes generated for", self.name) aggregator in self.aggregators: aggregator.quotes(self.name, quotes) def listener(self,aggregator): print("market {0} adding new aggregator".format(self.name)) self.aggregators.append(aggregator) def symbols(self): return list(self.symbolmeans.keys()) def run(self): def generate_symbols(): while true: time.sleep(random.random()) self.generate() thread = threading.thread(target=generate_symbols) thread.setdaemon(true) thread.start() def main(): nasdaq = stockmarket("nasdaq", ["aapl", "csco", "msft", "goog"]) newyork = stockmarket("nyse", ["ibm", "hpq", "bp"]) daemon = pyro4.daemon("159.8.183.94") nasdaq_uri = daemon.register(nasdaq, "nasdaq") newyork_uri = daemon.register(newyork, "newyork") ns = pyro4.locatens() ns.register("example.stockmarket.nasdaq", nasdaq_uri) ns.register("example.stockmarket.newyork", newyork_uri) nasdaq.run() newyork.run() print("stockmarkets running.") daemon.requestloop() if __name__ == "__main__": main() aggregator.py
from __future__ import print_function import pyro4 class aggregator(object): def __init__(self): self.viewers = {} self.symbols = [] def add_symbols(self, symbols): self.symbols.extend(symbols) def available_symbols(self): return self.symbols def view(self, viewer, symbols): print("aggregator gets new viewer, symbols:", symbols) self.viewers[viewer] = symbols def quotes(self, market, stockquotes): print (market) print (stockquotes) symbol, value in stockquotes.items(): viewer, symbols in self.viewers.items(): if symbol in symbols: viewer.quote(market, symbol, value) def main(): aggregator = aggregator() daemon = pyro4.daemon(host="159.8.183.94") agg_uri = daemon.register(aggregator, "aggregator") ns = pyro4.locatens() ns.register("example.stockquote.aggregator", agg_uri) market, market_uri in ns.list(prefix="example.stockmarket.").items(): print("joining market", market) stockmarket = pyro4.proxy(market_uri) stockmarket.listener(aggregator) aggregator.add_symbols(stockmarket.symbols()) if not aggregator.available_symbols(): raise valueerror("no symbols found! (have started stock market first?)") print("aggregator running. symbols:", aggregator.available_symbols()) daemon.requestloop() if __name__ == "__main__": main() ==== client side ====
viewer.py
from __future__ import print_function import sys import pyro4 if sys.version_info < (3,0): input = raw_input class viewer(object): def quote(self, market, symbol, value): print("{0}.{1}: {2}".format(market, symbol, value)) def main(): viewer = viewer() daemon = pyro4.daemon() daemon.register(viewer) ns = pyro4.locatens(host="159.8.183.94", port=8080) aggregator_uri = ns.lookup("example.stockquote.aggregator") print ("aggregator uri ", aggregator_uri) aggregator = pyro4.proxy(aggregator_uri) print("available stock symbols:", aggregator.available_symbols()) symbols = input("enter symbols want view (comma separated):") symbols = [symbol.strip() symbol in symbols.split(",")] aggregator.view(viewer, symbols) print("viewer listening on symbols", symbols) daemon.requestloop() if __name__ == "__main__": main() ==== how run code ====
on server machine, ran following code define name server
python -m pyro4.naming --host 159.8.183.94 --port 8080 then ran stockmarket.py , aggregator.py, fine far. afer that, started viewer.py, type symbols want see, observe error stockmarket.py
exception in thread thread-18: traceback (most recent call last): file "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner self.run() file "/usr/lib/python2.7/threading.py", line 763, in run self.__target(*self.__args, **self.__kwargs) file "stockmarket.py", line 37, in generate_symbols self.generate() file "stockmarket.py", line 24, in generate aggregator.quotes(self.name, quotes) file "/usr/local/lib/python2.7/dist-packages/pyro4/core.py", line 171, in __call__ return self.__send(self.__name, args, kwargs) file "/usr/local/lib/python2.7/dist-packages/pyro4/core.py", line 410, in _pyroinvoke msg = message.message.recv(self._pyroconnection, [message.msg_result], hmac_key=self._pyrohmackey) file "/usr/local/lib/python2.7/dist-packages/pyro4/message.py", line 168, in recv msg = cls.from_header(connection.recv(cls.header_size)) file "/usr/local/lib/python2.7/dist-packages/pyro4/socketutil.py", line 448, in recv return receivedata(self.sock, size) file "/usr/local/lib/python2.7/dist-packages/pyro4/socketutil.py", line 182, in receivedata raise err connectionclosederror: receiving: not enough data i think it's small bug in code, , i've been stuck here several hours, suggestions or appreciated!! thanks!!
the code posted works fine, i'm running on machine without problems. ofcourse i've replaced ip address hostname of machine.
so it's problem of network setup, or difference in software configuration on server , client machines.
to rule out problems network, have tried run on same machine (the server)? problem viewer (meaning: after starting stockmarket , aggregator, printing stock tickers without errors?)
also, enable debug logging , see if can find useful in logs pyro produces. maybe point problem. have @ http://pythonhosted.org/pyro4/tipstricks.html#logging
finally - have provide more information able begin figuring out issue. os using on server , client? python , pyro versions on server , client? etc.
Comments
Post a Comment