异步错误,尝试对不是套接字的东西进行操作 [英] Asyncio error, An operation was attempted on something that is not a socket

查看:27
本文介绍了异步错误,尝试对不是套接字的东西进行操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在编写当前的玩具代码以尝试理解 asyncio 模块.

I'm currently working on the current toy code to try and understand the asyncio module.

import asyncio
import os, sys, traceback
from time import time

os.environ['PYTHONASYNCIODEBUG'] = '1'
print(sys.version)

def timed_fib(n):
    def fib(n):
        return fib(n - 1) + fib(n - 2) if n > 1 else n
    a = time()
    return fib(n), time() - a

def process_input():
    text = sys.stdin.readline()
    n = int(text.strip())
    print('fib({}) = {}'.format(n, timed_fib(n)))


@asyncio.coroutine
def print_hello():
    while True:
        print("{} - Hello world!".format(int(time())))
        yield from asyncio.sleep(3)

def main():
    loop = asyncio.get_event_loop()
    loop.add_reader(sys.stdin, process_input)
    loop.run_until_complete(print_hello())


if __name__ == '__main__':
    main()

然而,尝试运行它会产生下面令人难以置信的神秘回溯.如您所见,调试环境变量设置在上面代码的第五行,但是,回溯仍然非常无用,如下所示:

However, trying to run this yields the incredibly cryptic traceback below. As you can see, the debug environment variable is set in the fifth line of the code above, however, the traceback remains incredibly unhelpful, as below:

3.4.3rc1 (v3.4.3rc1:69dd528ca625+, Feb  8 2015, 11:01:19) [MSC v.1600 32 bit (In
tel)]
Traceback (most recent call last):
  File "test.py", line 33, in <module>
    main()
  File "test.py", line 29, in main
    loop.run_until_complete(print_hello())
  File "C:\Python34\lib\asyncio\base_events.py", line 304, in run_until_complete

    self.run_forever()
  File "C:\Python34\lib\asyncio\base_events.py", line 276, in run_forever
    self._run_once()
  File "C:\Python34\lib\asyncio\base_events.py", line 1136, in _run_once
    event_list = self._selector.select(timeout)
  File "C:\Python34\lib\selectors.py", line 314, in select
    r, w, _ = self._select(self._readers, self._writers, [], timeout)
  File "C:\Python34\lib\selectors.py", line 305, in _select
    r, w, x = select.select(r, w, w, timeout)
OSError: [WinError 10038] An operation was attempted on something that is not a
socket

如何访问更有用的回溯,可能是什么问题?如果重要的话,我使用的是 Windows 7.

How can I access a more useful traceback, and what might be the problem? I am on Windows 7, if it matters.

推荐答案

select() 仅适用于 Windows 上的套接字.

select() works only with sockets on Windows.

要使用文件描述符,您可以尝试基于非选择的事件循环,代码示例:

To work with file descriptors, you could try non-select-based event loop, code example:

if os.name == 'nt':
    loop = asyncio.ProactorEventLoop() # for subprocess' pipes on Windows
    asyncio.set_event_loop(loop)
else:
    loop = asyncio.get_event_loop()

虽然我怀疑它对 sys.stdinasyncio代码示例.

Though I doubt that it would help with sys.stdin and asyncio, code example.

这篇关于异步错误,尝试对不是套接字的东西进行操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆