[Python-3000] iostack and sock2

Giovanni Bajo rasky at develer.com
Tue Jun 6 20:15:07 CEST 2006


> On 6/6/06, Giovanni Bajo <rasky at develer.com> wrote:
>> tomer filiba <tomerfiliba at gmail.com> wrote:
>>
>>>> One thing I would like to raise is the issue of KeyboardInterrupt.
>>>> I find very inconvenient that a normal application doing a very
>>>> simple blocking read from a socket can't be interrupted by a CTRL+C
>>>> sequence. Usually, what I do is to setup a timeout on the sockets
>>>> (eg. 0.4 seconds) and then simply retry if the data has not arrived
>>>> yet. But this changes the code from:
>>>
>>> from my experience with linux and solaris, this CTRL+C problem only
>>> happens on windows machines. but then again, windows can't select()
>>> on anything but sockets, so there's not gonna be a generic solution.
>>
>> Windows has WaitForMultipleObjects() which can be used to multiplex
>> between sockets and other handles.
>>
> WaitForMultipleObjects doesnt work on sockets of files...

You can use WSAAsyncSelect to activate message notification for socket events,
and then wait with MsgWaitForMultipleObjects.

Qt has a very good portable "reactor" implementation (QEventLoop in Qt3, could
be renamed in Qt4) where you can register various events, including socket
notifications and of course normal window messages. The implementation in Qt4
is GPL so you can have a look (src/corelib/kernel/qeventdispatcher_win.cpp).

It *is* possible to have a single point of event dispatching under Windows too,
and it is even possible to have it wrapped portably as Qt did. This is why I do
expect Python to be able to handle this kind of things. Whatever portable
poll/epoll/kqueue-kind of thing we end up with Py3k, it should use a similar
technique under Windows to make sure normal messages are still processed. You
really don't want to wait on sockets only and ignore Window messages altogether
anyway.

Giovanni Bajo



More information about the Python-3000 mailing list