wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Windows上的python select.select()大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我正在使用 here中的代码测试UDP打孔.它可以在Linux上运行,但在Windows上报告错误.这是发生错误的代码片段: while True: rfds, _, _ = SELEct([0, sockfd], [], []) # sockfd is a socket if 0 in rfds: data = sys.stdin.readline()
我正在使用 here中的代码测试UDP打孔.它可以在Linux上运行,但在Windows上报告错误.这是发生错误代码片段:

while True:
    rfds,_,_ = SELEct([0,sockfd],[],[])  # sockfd is a socket
    if 0 in rfds:
        data = sys.stdin.readline()
        if not data:
            break
        sockfd.sendto(data,target)
    elif sockfd in rfds:
        data,addr = sockfd.recvfrom(1024)
        sys.stdout.write(data)

错误消息:

TraceBACk (most recent call last):
  File "udp_punch_client.py",line 64,in <module>
    main()
  File "udp_punch_client.py",line 50,in main
    rfds,[])
SELEct.error: (10038,'')

我知道这个错误与Windows上的SELEct实现有一些关系,每个人都引用这个

所以我有两个问题:

> [0,sockfd]中的0是什么意思?这是一种经常使用的技术吗?
>如果SELEct仅适用于Windows上的套接字,如何使代码与Windows兼容?

谢谢.

解决方法

不幸的是,SELEct不会帮助你在一个线程中处理stdin和网络事件,因为SELEct不能用于Windows上的流.你需要的是一种无阻塞地读取stdin的方法.你可以使用:

> stdin的额外线程.这应该工作正常,是最简单的工作方式.如果您需要的只是等待I / O事件,Python线程支持完全可以的.
>类似greenlet的机制,如gevent,修补线程支持和标准库的大多数I / O功能,以防止它们阻塞greenlet.还有像twisted(参见注释)这样的库提供非阻塞文件I / O.这种方式是最一致的,但它应该要求使用与您的框架匹配的样式来编写整个应用程序(扭曲或gevent,差异并不重要).但是,我怀疑扭曲的包装器不能从Windows上的stdin进行异步输入(很确定它们可以在* nix上执行此操作,因为它们可能使用相同的选择).>其他一些技巧.然而,大多数可能的技巧都相当丑陋.

大佬总结

以上是大佬教程为你收集整理的Windows上的python select.select()全部内容,希望文章能够帮你解决Windows上的python select.select()所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:select