【问题标题】:Python: select or poll on threading.eventPython:在 threading.event 上选择或轮询
【发布时间】:2015-01-25 00:25:23
【问题描述】:

我最近读到 BSD kqueue 可以接受各种事件,而不仅仅是文件描述符。但对于 Linux 用户来说,它看起来像这样: (来自socketserver python stdlib)

#self being passed to select is a listening socket
try:
    while not self.__shutdown_request:
        # XXX: Consider using another file descriptor or
        # connecting to the socket to wake this up instead of
        # polling. Polling reduces our responsiveness to a
        # shutdown request and wastes cpu at all other times.
        r, w, e = _eintr_retry(select.select, [self], [], [],
                               poll_interval)
        if self in r:
            self._handle_request_noblock()

        self.service_actions()

是否有一些聪明的方法来检查threading.Event()selectpoll 还是必须连接第二个套接字来监听关闭事件的不可避免的情况?

编辑:我要寻找的是这样的: select.select([self, clever_wrapper(self.__shutdown_request)], [], [])

【问题讨论】:

    标签: python linux multithreading sockets


    【解决方案1】:

    是否有一些聪明的方法可以通过 select 或 poll 来检查 threading.Event(),还是必须连接第二个套接字来监听关闭事件的不可避免的情况?

    我不确定我是否理解正确,但是如果您想检测对等方的关闭,您可以简单地使用 select 和 poll 执行此操作,然后进行读取。也就是说,如果 select/poll 返回读取套接字以进行读取,然后您读取并没有返回任何数据但也没有错误,那么您知道对等方发出了关闭。

    不需要第二个套接字,当然第二个连接甚至无法检测到第一个连接是否已关闭。

    【讨论】:

    • 不,您不是在尝试检测对等方是否已关闭 - 是您自己的进程(或者可能是另一个线程)通过关闭事件调用您的(在这种情况下为服务器)。
    • 那么你想从线程A检测线程B是否关闭了套接字?如果您尝试选择/轮询,它将引发错误,因为您使用了无效的文件描述符。 kqueue 在这里也无济于事。
    • 您想在不运行while 循环的情况下检测self.__shutdown_request:
    • 我不确定我是否理解您的意图。你想明确地关闭一个套接字,但你不想告诉任何其他线程,并希望他们能以某种方式得到通知,即使他们没有在这个套接字上读/写/选择?
    • 我不确定有什么不清楚的地方——你想知道服务器是否收到了关闭请求,而不是运行一个 while 循环并不断超时你的选择来检查是否有关闭请求进入。
    猜你喜欢
    • 1970-01-01
    • 2011-11-19
    • 2011-03-16
    • 1970-01-01
    • 2018-07-06
    • 2021-06-02
    • 2011-02-24
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多