将唤醒文件描述符设置为 fd。 当接收到信号时,信号编号作为单个字节写入 fd。 库可以使用它来唤醒轮询或选择调用,从而允许完全处理信号。
返回旧的唤醒 fd(如果未启用文件描述符唤醒,则返回 -1)。 如果 fd 为 -1,则禁用文件描述符唤醒。 如果不是 -1,则 fd 必须是非阻塞的。 在再次调用 poll 或 select 之前,库需要从 fd 中删除任何字节。
启用线程时,该函数只能从主线程调用; 尝试从其他线程调用它会导致引发 ValueError 异常。
有两种常用方法可以使用此功能。 在这两种方法中,您都使用 fd 在信号到达时唤醒,但是它们在确定 哪个 信号已到达的方式上有所不同。
在第一种方法中,我们从 fd 的缓冲区中读取数据,字节值为您提供信号编号。 这很简单,但在极少数情况下会遇到问题:通常 fd 的缓冲区空间量有限,如果太多信号到达太快,则缓冲区可能已满,并且可能会丢失一些信号。 如果你使用这种方法,那么你应该设置warn_on_full_buffer=True,这至少会导致在信号丢失时向stderr打印警告。
在第二种方法中,我们使用唤醒 fd only 进行唤醒,并忽略实际字节值。 在这种情况下,我们只关心 fd 的缓冲区是空的还是非空的; 一个完整的缓冲区根本不表示有问题。 如果您使用这种方法,那么您应该设置 warn_on_full_buffer=False,这样您的用户就不会被虚假的警告消息所迷惑。
3.5 版更改: 在 Windows 上,该函数现在也支持套接字句柄。
3.7 版更改: 添加 warn_on_full_buffer 参数。