安利一篇我翻译的国外大牛的神经网络入门文章
1. 代码细节
async_std.py
# -*- coding: utf-8 -*-
import sys
import errno
from tornado.util import errno_from_exception
from tornado.iostream import BaseIOStream
from tornado import gen
try:
from tornado.platform.posix import _set_nonblocking
except ImportError:
_set_nonblocking = None
_ERRNO_WOULDBLOCK = (errno.EWOULDBLOCK, errno.EAGAIN)
class UnblockStdIOStreamBase(BaseIOStream):
"""std-based `IOStream` implementation.
"""
def __init__(self, fd, *args, **kwargs):
self.fd = fd
_set_nonblocking(fd)
super(UnblockStdIOStreamBase, self).__init__(*args, **kwargs)
def fileno(self):
return self.fd
def close_fd(self):
self.fd.close()
def write_to_fd(self, data):
return self.fd.write(data)
def read_from_fd(self):
try:
chunk = self.fd.read(self.read_chunk_size)
except (IOError, OSError) as e:
if errno_from_exception(e) in _ERRNO_WOULDBLOCK:
return None
elif errno_from_exception(e) == errno.EBADF:
# If the writing half of a pipe is closed, select will
# report it as readable but reads will fail with EBADF.
self.close(exc_info=True)
return None
else:
raise
if not chunk:
self.close()
return None
return chunk
class UnblockStdinStream(UnblockStdIOStreamBase):
def __init__(self, io_loop):
super(UnblockStdinStream, self).__init__(sys.stdin, io_loop=io_loop)
@gen.coroutine
def readline(self):
ret = yield self.read_until('\n')
raise gen.Return(ret)
test.py
# -*- coding: utf-8 -*-
import tornado.ioloop
from tornado import gen
from async_std import UnblockStdinStream
ioloop = tornado.ioloop.IOLoop.instance()
_std = UnblockStdinStream(io_loop=ioloop)
@gen.coroutine
def test():
while True:
ret = yield _std.readline()
print(ret)
@gen.coroutine
def test2():
while True:
yield gen.sleep(2)
print('sleep 2s')
ioloop.add_callback(test)
ioloop.add_callback(test2)
ioloop.start()
2. 测试
# python test.py
sleep 2s
sleep 2s
sleep 2s
sleep 2s
sleep 2s
qwwer -----手动从屏幕输入
qwwer -----程序打印结果
sleep 2s
sleep 2s
sleep 2s
####另外安利我写的两个模块,欢迎使用或贡献代码:
一个命令行版本的zookeeper cli
一个tornado web app框架快速生成工具
欢迎关注我的github