Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """Пример пула с недемоническими процессами"""
- import itertools
- import multiprocessing
- import multiprocessing.pool
- import time
- from random import randint
- class Process_NoDaemon(multiprocessing.Process):
- """Процесс, который игнорирует атрибут `daemon`"""
- # Заменим атрибут 'daemon' на property, которая всегда возвращает False
- @property
- def daemon(self):
- return False
- @daemon.setter
- def daemon(self, value):
- pass
- class Pool_NoDaemon(multiprocessing.pool.Pool):
- """Пул, который порождает недемонические процессы"""
- # Порождение новых процессов
- @staticmethod
- def Process(ctx, *args, **kwds):
- return Process_NoDaemon(*args, **kwds)
- def subworker(args):
- """Функция, которая должна вызываться в работниках второго порядка"""
- i, t = args
- print(f"Порождён родителем {i}: сплю {t} сек.")
- time.sleep(t)
- return t
- def worker(args):
- """Функция, которая выполняется в не-демонических работниках"""
- i, num_kids = args
- print(f"Работник {i}: порождаю {num_kids} демонических отпрысков.")
- pool = multiprocessing.Pool(num_kids)
- result = pool.map(subworker,
- zip(
- itertools.repeat([i]),
- [randint(1, 5) for x in range(num_kids)])
- )
- # ждём-с
- pool.close()
- pool.join()
- return result
- def main():
- print("Порождаю 5 недемонических отпрысков.")
- pool = Pool_NoDaemon(5)
- result = pool.map(worker, enumerate([randint(1, 5) for x in range(5)]))
- pool.close()
- pool.join()
- print(result)
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement