मैं एक Connection
उद्देश्य यह है कि पढ़ने के लिए होते हैं और asyncio
कनेक्शन की धाराओं लिखने के लिए प्रयोग किया जाता है है:स्ट्रीम से उपज करने का सही तरीका क्या है?
class Connection(object):
def __init__(self, stream_in, stream_out):
object.__init__(self)
self.__in = stream_in
self.__out = stream_out
def read(self, n_bytes : int = -1):
return self.__in.read(n_bytes)
def write(self, bytes_ : bytes):
self.__out.write(bytes_)
yield from self.__out.drain()
सर्वर साइड पर connected
एक Connection
वस्तु हर बार एक ग्राहक को जोड़ता है बनाता है, फिर 4 बाइट पढ़ता है।
@asyncio.coroutine
def new_conection(stream_in, stream_out):
conn = Connection(stream_in, stream_out)
data = yield from conn.read(4)
print(data)
और ग्राहक पक्ष पर, 4 बाइट लिखे गए हैं।
@asyncio.coroutine
def client(loop):
...
conn = Connection(stream_in, stream_out)
yield from conn.write(b'test')
यह लगभग रूप में की उम्मीद काम करता है, लेकिन मैं yield from
हर read
और write
कॉल करने के लिए है। मैं yield from
की कोशिश की है Connection
अंदर से ing:
def read(self, n_bytes : int = -1):
data = yield from self.__in.read(n_bytes)
return data
लेकिन बजाय डेटा प्राप्त करने, मैं
<generator object StreamReader.read at 0x1109983b8>
अगर मैं read
और write
फोन कई स्थानों से की तरह एक आउटपुट मिलता है, मैं नहीं करना पसंद करेंगे प्रत्येक बार yield from
एस दोहराएं; बल्कि उन्हें Connection
के अंदर रखते हुए। मेरे अंतिम लक्ष्य यह करने के लिए मेरे new_conection
समारोह में कटौती कर रहा है:
@asyncio.coroutine
def new_conection(stream_in, stream_out):
conn = Connection(stream_in, stream_out)
print(conn.read(4))
आपको क्यों पैदा करना है? यदि आप conn.read (4) से उपज नहीं करते हैं, तो ऐसा लगता है कि यह बस बाइट ऑब्जेक्ट देता है। क्या आप यहां क्या खोज रहे हैं? – RageCage
@RageCage: 'उपज' से उपज के बिना, 'conn.read (4)' अभी भी जनरेटर लौटाता है: '<जनरेटर ऑब्जेक्ट कनेक्शन 0x1019262b0 पर पढ़ें> –
क्षमा करें मुझे स्पष्ट करना चाहिए था; यदि आप conn.read() (एकल पंक्ति संस्करण) के पहले पुनरावृत्ति से उपज नहीं करते हैं तो परिणाम क्या है? – RageCage