基于tornado的实现的一个非阻塞的stdin

安利一篇我翻译的国外大牛的神经网络入门文章

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值