Created
April 20, 2010 12:51
-
-
Save elephantum/372384 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# автор Сибирев Андрей | |
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