Advertisement
pakuula

Пул с недемоническими процессами

Feb 17th, 2025
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.03 KB | Source Code | 0 0
  1. """Пример пула с недемоническими процессами"""
  2. import itertools
  3. import multiprocessing
  4. import multiprocessing.pool
  5. import time
  6.  
  7. from random import randint
  8.  
  9.  
  10. class Process_NoDaemon(multiprocessing.Process):
  11.     """Процесс, который игнорирует атрибут `daemon`"""
  12.     # Заменим атрибут 'daemon' на property, которая всегда возвращает False
  13.     @property
  14.     def daemon(self):
  15.         return  False
  16.     @daemon.setter
  17.     def daemon(self, value):
  18.         pass
  19.    
  20. class Pool_NoDaemon(multiprocessing.pool.Pool):
  21.     """Пул, который порождает недемонические процессы"""
  22.     # Порождение новых процессов
  23.     @staticmethod
  24.     def Process(ctx, *args, **kwds):
  25.         return Process_NoDaemon(*args, **kwds)
  26.  
  27. def subworker(args):
  28.     """Функция, которая должна вызываться в работниках второго порядка"""
  29.     i, t = args
  30.     print(f"Порождён родителем {i}: сплю {t} сек.")
  31.     time.sleep(t)
  32.     return t
  33.  
  34. def worker(args):
  35.     """Функция, которая выполняется в не-демонических работниках"""
  36.     i, num_kids = args
  37.     print(f"Работник {i}: порождаю {num_kids} демонических отпрысков.")
  38.     pool = multiprocessing.Pool(num_kids)
  39.  
  40.     result = pool.map(subworker,
  41.                       zip(
  42.                           itertools.repeat([i]),
  43.                          [randint(1, 5) for x in range(num_kids)])
  44.                       )
  45.     # ждём-с
  46.     pool.close()
  47.     pool.join()
  48.     return result
  49.  
  50. def main():
  51.     print("Порождаю 5 недемонических отпрысков.")
  52.     pool = Pool_NoDaemon(5)
  53.  
  54.     result = pool.map(worker, enumerate([randint(1, 5) for x in range(5)]))
  55.  
  56.     pool.close()
  57.     pool.join()
  58.     print(result)
  59.  
  60. if __name__ == '__main__':
  61.     main()
Tags: python
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement