Files
courses/py3interm/EXAMPLES/multi_processing.py
T
2025-05-20 11:57:43 -04:00

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)