I'm porting one of my projects from C# and am having trouble solving a multithreading issue in Python.  The problem relates to a long-lived HTTP request, which is expected (the request will respond when a certain event occurs on the server).  Here's the summary:
I send the request using urllib2 on a separate thread.  When the request returns or times out, the main thread is notified.  This works fine.  However, there are cases where I need to abort this outstanding request and switch to a different URL.  There are four solutions that I can consider:

Abort the outstanding request.  C# has WebRequest.Abort(), which I can call cross-thread to abort the request.  Python urllib2.Request appears to be a pure data class, in that instances only store request information; responses are not connected to Request objects.  So I can't do this.
Interrupt the thread.  C# has Thread.Interrupt(), which will raise a ThreadInterruptedException in the thread if it is in a wait state, or the next time it enters such a state.  (Waiting on a monitor and file/socket I/O are both waiting states.)  Python doesn't seem to have anything comparable; there does not appear to be a way to wake up a thread that is blocked on I/O.
Set a low timeout on the request.  On a timeout, check an "aborted" flag.  If it's false, restart the request.
Similar to option 3, add an "aborted" flag to the state object so that when the request does finally end in one way or another, the thread knows that the response is no longer needed and just shuts itself down.

Options 3 and 4 seem to be the only ones supported by Python, but option 3 is a horrible solution and 4 will keep open a connection I don't need.  I am hoping to be a good netizen and close this connection when I no longer need it.  Is there any way to actually abort the outstanding request, one way or another?
Similar to Spike Gronim's answer, but even more heavy handed.
Consider rewriting this in twisted.  You probably would want to subclass twisted.web.http.HTTPClient, in particular implementing handleResponsePart to do your client interaction (or handleResponseEnd if you don't need to see it before the response ends).  To close the connection early, you just call the loseConnection method on the client protocol.
Aborting HTTP request cross-thread