exarkun at intarweb.us
Fri Mar 7 00:13:53 CET 2003
On Thu, Mar 06, 2003 at 03:32:15PM -0600, sik0fewl wrote:
> I'm having some problems with some socket/thread code.
> What I'm doing is starting another thread to do the actual connect() so
> that my process doesn't block while connect does socket.getaddrinfo().
> What I have works fine if the host is localhost, otherwise it doesn't
> seem to ever connect.
> Here's the basis of my code:
> def threaded_connect(sock, address, port = None):
> sock.connect((address, port))
> x = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> thread.start_new_thread(threaded_connect, (x, 'www.hotmail.com', 80))
> while 1:
> # then I do select that waits for x to become writable
> # (ie, connected)
> Like I said, the select() works fine when connecting to localhost, but
> when I try any other address (like www.hotmail.com) the select keeps
> timing out and x never becomes connected.
You've made the socket non-blocking. This means socket.connect() will
return right away, *even if it has not yet connected*. Even leaving this
aside, your code has a race condition, nothing says that the connection in
the thread will be made before the select() loop begins.
It's hard to say exactly why x never shows up in your select, partly
because threaded programs are difficult to predict, and partly because you
haven't included the select-using code in the example.
I'd recommend -either- using threads -or- using non-blocking sockets, not
both (I'd further recommend not using threads).
There are libraries available to make this sort of programming easier.
You might check out Twisted - http://www.twistedmatrix.com/
up 3 days, 15:58, 6 users, load average: 0.04, 0.05, 0.00
More information about the Python-list