【问题标题】:Asynchronous sockets with select - Python带选择的异步套接字 - Python
【发布时间】:2012-08-25 01:16:23
【问题描述】:

我现在正在研究异步套接字,我有这个代码:

#!/usr/bin/env python 

""" 
An echo server that uses select to handle multiple clients at a time. 
Entering any line of input at the terminal will exit the server. 
""" 

import select 
import socket 
import sys 

host = 'localhost' 
port = 900 
backlog = 5 
size = 1024 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.bind((host,port)) 
server.listen(backlog) 
input = [server,sys.stdin] 
running = 1 
while running: 
    inputready,outputready,exceptready = select.select(input,[],[]) 

    for s in inputready: 

        if s == server: 
            # handle the server socket 
            client, address = server.accept() 
            input.append(client) 

        elif s == sys.stdin: 
            # handle standard input 
            junk = sys.stdin.readline() 
            running = 0 

        else: 
            # handle all other sockets 
            data = s.recv(size) 
            if data: 
                s.send(data) 
            else: 
                s.close() 
                input.remove(s) 
server.close()

它应该是一种使用 select() 的基本回显服务器,但是当我运行它时,我选择错误 10038 - 尝试使用不是套接字的东西进行操作。有人可以告诉我有什么问题吗?谢谢:)

【问题讨论】:

    标签: python sockets select


    【解决方案1】:

    我以前解决过一个非常相似的问题。

    您可以在自己的线程中运行异步循环,并在用户输入内容时将主线程.put 的数据放入Queue.queue。每次循环时,您都可以检查是否队列中有任何东西。如果确实如此,您将对其采取行动,在您的情况下,通过设置running=0

    如果你这样做,你需要给选择一个足够短的超时时间来响应用户输入,比如 0.01 秒。不要对这种超时使用感到反感,这就是 Twisted 的 Win32 选择反应器处理这个问题的方式。

    仅供参考,在 Unix 系统上,这种事情要容易上百万倍,在 Unix 系统上,您可以选择的不仅仅是套接字。我相信在 Windows 上,select 系统调用是由 Winsock 提供的。在 Unix 上,您可以选择带有文件描述符的任何内容。

    如果您需要更多说明,请告诉我。

    编辑:你也可以看看multiprocessing.pipe

    【讨论】:

      【解决方案2】:

      您在 Windows 上工作,不是吗?在 Windows 上,选择仅适用于套接字。但是 sys.stdin 不是套接字。从第 15 行删除它,它应该可以工作。

      在 Linux 或类似系统上,我希望它可以按照上面列出的方式工作。

      【讨论】:

      • 感谢您的回答,是的,我在 Windows 上工作。那么我该怎么做才能让系统输入在这个例子中的窗口上工作呢?
      • 好吧,老实说,我不确定。我能想到的是:在一个线程中使用 select 处理套接字,并使用阻塞 IO 在一个单独的线程中处理文件(如 sys.stdin)。这当然不是最好的解决方案,但它应该可以工作,尤其是当您只使用 sys.stdin 来终止整个思考时。
      • 这里的代码 sn-p 展示了如何在 Windows 下解决 select-on-stdin 问题。此代码适用于 Windows 和 POSIX-y 操作系统:public.msli.com/lcs/jaf/windows_stdin_select_example.py
      【解决方案3】:

      关于documentation,与select交互的正确方式是

      ready_to_read, ready_to_write, in_error = select.select(potential_readers,
                                                              potential_writers,
                                                              potential_errs,
                                                              timeout)
      

      在你的代码中,

      input = [server,sys.stdin] 
      

      sys.stdin 不是套接字(而是文件描述符)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-17
        • 2021-01-25
        相关资源
        最近更新 更多