Skip to main content

Implementation of `select.poll` on Microsoft Windows.

Project description

Implementation of select.poll on Microsoft Windows.

  • Pure Python; no C extensions (uses ctypes.windll.Ws2_32)
  • Drop-in-compatible API
  • Clean "ponyfill"; library does no monkeypatching
  • Python 3.7+ compatible
  • No dependencies

Usage

Alternative to select.poll

try:
    from select import (
        POLLIN, POLLOUT, POLLERR, POLLHUP, POLLNVAL,
        poll
    )

except ImportError:
    # https://github.com/python/cpython/issues/60711
    from winpoll import (
        POLLIN, POLLOUT, POLLERR, POLLHUP, POLLNVAL,
        wsapoll as poll
    )
p = poll()

p.register(sock1, POLLIN)
p.register(sock2, POLLIN | POLLOUT)
p.unregister(sock1)

for fd, events in p.poll(3):
    print(f"<socket.socket fd={fd}> is ready with {events}")

Like select.poll, winpoll.wsapoll objects acquire no special resources, thus have no cleanup requirement (besides plain garbage collection).

Alternative to selectors.PollSelector/selectors.DefaultSelector

import sys
from selectors import (
    EVENT_READ, EVENT_WRITE,
    DefaultSelector, SelectSelector
)

if (DefaultSelector is SelectSelector) and (sys.platform == 'win32') and (sys.getwindowsversion() >= (10, 0, 19041)):
    # https://github.com/python/cpython/issues/60711
    from winpoll import WSAPollSelector as DefaultSelector
s = DefaultSelector()

s.register(sock1, EVENT_READ)
s.register(sock2, EVENT_READ | EVENT_WRITE)
s.unregister(sock1)

for (sock, _fd, _eventmask, _data), events in s.select(3):
    print(f"{sock} is ready with {events}")

Limitations / Bugs

  • Does not work before Windows Vista.

    • Last affected OS: Windows XP (EOL April 8, 2014; not supported by Python 3.7+ anyway.)
  • Outbound TCP connections don't correctly report failure-to-connect ((POLLHUP | POLLERR | POLLWRNORM)) before Windows 10 version 2004 ("May 2020 Update" / "20H1" / "OS Build 19041").

Installation

Command-line

pip install "winpoll ; sys_platform == 'win32'"

requirements.txt

...
winpoll ; sys_platform == 'win32'

setup.py

...

setup(
    ...,
    install_requires: [
        ...,
        "winpoll ; sys_platform == 'win32'"
    ]
)

pyproject.toml

[project]
...

dependencies = [
  ...,
  "winpoll ; sys_platform == 'win32'",
]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

winpoll-0.20301.3.tar.gz (10.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

winpoll-0.20301.3-py3-none-any.whl (12.2 kB view details)

Uploaded Python 3

File details

Details for the file winpoll-0.20301.3.tar.gz.

File metadata

  • Download URL: winpoll-0.20301.3.tar.gz
  • Upload date:
  • Size: 10.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.9

File hashes

Hashes for winpoll-0.20301.3.tar.gz
Algorithm Hash digest
SHA256 ed99e1f26378f94dd885c78c502cab8f8e4cdf7f5305d39dba8d8fc68a8376ca
MD5 c88499139b6402148ed0e085bc217fcc
BLAKE2b-256 6cce0ac13897f573d2a6f9ebac9fb67ed3e0c9514def906adf24662e4efc7806

See more details on using hashes here.

File details

Details for the file winpoll-0.20301.3-py3-none-any.whl.

File metadata

  • Download URL: winpoll-0.20301.3-py3-none-any.whl
  • Upload date:
  • Size: 12.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.9

File hashes

Hashes for winpoll-0.20301.3-py3-none-any.whl
Algorithm Hash digest
SHA256 e6cd4c728056460a9aa5bdad11353639f6ba8c2df022eecd24733c0e8ad54ba4
MD5 bf986445d610c7312b28c81ad58b2636
BLAKE2b-256 3abb127203e3d4488f8f3e250dcff990942415a46f4a9d521309eb586246fa6e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page