77 lines
1.8 KiB
Python
77 lines
1.8 KiB
Python
#!/usr/bin/env python
|
|
import sys
|
|
import random
|
|
from multiprocessing import Manager, Lock, Process, Queue, freeze_support
|
|
from queue import Empty
|
|
import time
|
|
|
|
NUM_ITEMS = 25000 # <1>
|
|
POOL_SIZE = 100
|
|
|
|
|
|
class RandomWord(): # <2>
|
|
def __init__(self):
|
|
with open('../DATA/words.txt') as words_in:
|
|
self._words = [word.rstrip('\n\r') for word in words_in]
|
|
self._num_words = len(self._words)
|
|
|
|
def __call__(self): # <3>
|
|
return self._words[random.randrange(0, self._num_words)]
|
|
|
|
|
|
class Worker(Process): # <4>
|
|
|
|
def __init__(self, name, queue, lock, result): # <5>
|
|
Process.__init__(self)
|
|
self.queue = queue
|
|
self.result = result
|
|
self.lock = lock
|
|
self.name = name
|
|
|
|
def run(self): # <6>
|
|
while True:
|
|
try:
|
|
word = self.queue.get(block=False) # <7>
|
|
word = word.upper() # <8>
|
|
with self.lock:
|
|
self.result.append(word) # <9>
|
|
|
|
except Empty: # <10>
|
|
break
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if sys.platform == 'win32':
|
|
freeze_support()
|
|
|
|
word_queue = Queue() # <11>
|
|
|
|
manager = Manager() # <12>
|
|
shared_result = manager.list() # <13>
|
|
result_lock = Lock() # <14>
|
|
|
|
random_word = RandomWord() # <15>
|
|
for i in range(NUM_ITEMS):
|
|
w = random_word()
|
|
word_queue.put(w) # <16>
|
|
|
|
start_time = time.ctime()
|
|
|
|
pool = [] # <17>
|
|
for i in range(POOL_SIZE): # <18>
|
|
worker_name = "Worker {:03d}".format(i)
|
|
w = Worker(worker_name, word_queue, result_lock, shared_result) # <19>
|
|
#
|
|
w.start() # <20>
|
|
pool.append(w) # <21>
|
|
|
|
for t in pool:
|
|
t.join() # <22>
|
|
|
|
end_time = time.ctime()
|
|
|
|
print((shared_result[-50:])) # <23>
|
|
print(len(shared_result))
|
|
print(start_time)
|
|
print(end_time)
|