My application uses multiple I/O blocking (network) requests that take a while to complete. 
I tried using multi threading but it doesn't appear to bring any speedup, I'm guessing it's something to do with Python's GIL.

The thing is all of the requests can be done concurrently and have no dependencies on each other. How do I solve this performance issue?

My code

```
import threading
import urllib2
import time
def send_request(url, count_str):
    start_time = time.time()
    urllib2.urlopen(url)
    print "Request " + count_str + " took " + str(time.time() - start_time) + " started at " + str(start_time)

count = 0
for url in open('urllist.txt'):
    t = threading.Thread(target=send_request, args = (url.strip(), str(count)))
    t.start()
    count+=1

```

The output is 

```
Request 1 took 5.0150949955 started at 1458789266.78
Request 2 took 10.0112490654 started at 1458789266.79
Request 0 took 15.024559021 started at 1458789266.78
Request 3 took 20.016972065 started at 1458789266.79

```

The urls in urllist.txt point to a server I'm running locally that take 5 seconds to respond. 
As you can see they all "start" at the same time, but they are blocking.