import itertools as it
import threading, Queue
class PMapWorker (threading.Thread):
def __init__ (self, f, q):
threading.Thread.__init__ (self)
self.results = list ()
self.f = f
self.q = q
def run(self):
while True:
try:
x = self.q.get_nowait ()
self.results.append (self.f (x))
self.q.task_done ()
except Queue.Empty:
return
def map (threadcount, f, xs):
q = Queue.Queue ()
for x in xs:
q.put (x)
workers = [PMapWorker (f, q) for i in range (0, threadcount)]
for worker in workers:
worker.start ()
q.join ()
return it.chain (*[worker.results for worker in workers])