Skip to content

Instantly share code, notes, and snippets.

@elephantum
Created April 20, 2010 12:51
Show Gist options
  • Save elephantum/372384 to your computer and use it in GitHub Desktop.
Save elephantum/372384 to your computer and use it in GitHub Desktop.
# автор Сибирев Андрей
from operator import itemgetter
from time import sleep
from random import random
import threading
import Queue
def sleeper(arg):
sleep(random())
return arg
def threaded_map(f, args, n_threads=3):
terminator = object()
input = Queue.Queue()
output = Queue.Queue()
def worker():
while True:
task = input.get(block=True)
if task is terminator:
return
result = f(task[1])
output.put((task[0], result))
args_numbered = enumerate(args)
threads = []
for i in range(n_threads):
threads.append(threading.Thread(target=worker))
threads[i].start()
for task in args_numbered:
input.put(task)
for n in range(n_threads):
input.put(terminator)
for t in threads:
t.join()
results = []
while(not output.empty()):
results.append(output.get())
results.sort(key=itemgetter(0))
return [item for (n, item) in results]
if __name__ == "__main__":
print threaded_map(sleeper,range(10))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment