Завершение многопроцессорного процесса при выполнении условия

Иногда, когда в процессе dev есть обе рабочие станции WIN и системы LINUX (хостинг), а в коде вы не видите никакого вывода перед соответствующей строкой, это может быть форматирование файла и отсутствие Unix LF (linefeed) заканчивается.

Что мы обычно делаем, чтобы быстро исправить это, переименуйте файл, а в системе LINUX создайте новый файл вместо переименованного, а затем скопируйте его в него. Во многих случаях это решает проблему, так как некоторые из файлов, которые были созданы в WIN, когда-то перемещенные на хостинг, вызывают эту проблему.

Это исправление - это легкое исправление для сайтов, которыми мы управляем по FTP, и иногда может спасти наш новый членов команды некоторое время.

2
задан Darkonaut 27 February 2019 в 16:07
поделиться

1 ответ

Если вам нужно мгновенное убийство, вы можете использовать multiprocessing.Event, чтобы сообщить родительскому процессу о выполненном условии и позволить ему немедленно уничтожить рабочие процессы. Процесс менеджера был бы слишком тяжелым для такой небольшой синхронизации.

import os
from datetime import datetime
from multiprocessing import Process, Event


def worker(range_, target, found_event):
    print('{} | pid: {} started'.format(datetime.now(), os.getpid()))
    for x in range_:
        if x == target:
            print('{} | pid: {} found target'.format(
                datetime.now(), os.getpid())
            )
            found_event.set()


if __name__ == "__main__":

    N_WORKERS = 4

    step = int(200e6)
    ranges = [range(x, x + step) # change `range` to `xrange` for Python 2
              for x in range(0, N_WORKERS * step, step)]
    # range(0, 200000000), ..., range(800000000, 1000000000)]
    target = int(150e6)  # <-- worker finding this value triggers massacre
    found_event = Event()

    pool = [Process(target=worker, args=(range_, target, found_event))
            for range_ in ranges]

    for p in pool:
        p.start()

    found_event.wait()  # <- blocks until condition met
    print('{} | terminating processes'.format(datetime.now()))
    for p in pool:
        p.terminate()
    for p in pool:
        p.join()
    print('{} | all processes joined'.format(datetime.now()))

Пример вывода:

2019-01-17 01:55:33.781884 | pid: 28376 started
2019-01-17 01:55:33.782333 | pid: 28377 started
2019-01-17 01:55:33.782851 | pid: 28378 started
2019-01-17 01:55:33.783484 | pid: 28379 started
2019-01-17 01:55:54.715425 | pid: 28376 found target
2019-01-17 01:55:54.715613 | terminating processes
2019-01-17 01:55:54.716326 | all processes joined

Process finished with exit code 0
0
ответ дан Darkonaut 27 February 2019 в 16:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: