Worth having a timeout in args to urlopen to stop these threads potentially queueing up? Not sure I particularly like seeing threads created inline with the request. Much rather N threads created early and reading from a (internal) queue, that way the call here is only enqueuing a dict, and the threads/queue can take responsibility for handling overruns or failures directly (in the same way you'd use multiprocess and give the pool a queue to read from - no, not suggesting multiprocess).

Not saying this won't work though, but under any sort of load I think we may find it thrashing here.