これまで、使用する必要があるときはいつでもmultiprocessing
、手動で「プロセスプール」を作成し、すべてのサブプロセスと作業キューを共有することで使用してきました。
例えば:
from multiprocessing import Process, Queue
class MyClass:
def __init__(self, num_processes):
self._log = logging.getLogger()
self.process_list = []
self.work_queue = Queue()
for i in range(num_processes):
p_name = 'CPU_%02d' % (i+1)
self._log.info('Initializing process %s', p_name)
p = Process(target = do_stuff,
args = (self.work_queue, 'arg1'),
name = p_name)
このようにして、サブプロセスによって消費されるものをキューに追加できます。Queue.qsize()
次に、 :をチェックすることで、処理がどの程度進んだかを監視できます。
while True:
qsize = self.work_queue.qsize()
if qsize == 0:
self._log.info('Processing finished')
break
else:
self._log.info('%d simulations still need to be calculated', qsize)
今、私はそれmultiprocessing.Pool
がこのコードをかなり単純化できると思います。
私が見つけられなかったのは、まだ行われていない「作業」の量をどのように監視できるかということです。
次の例を見てください。
from multiprocessing import Pool
class MyClass:
def __init__(self, num_processes):
self.process_pool = Pool(num_processes)
# ...
result_list = []
for i in range(1000):
result = self.process_pool.apply_async(do_stuff, ('arg1',))
result_list.append(result)
# ---> here: how do I monitor the Pool's processing progress?
# ...?
何か案は?