Передаются ли данные, хранящиеся в threading.local, дочерним процессам, запущенным с ProcessPoolExecutor? - PullRequest
0 голосов
/ 23 марта 2020

Если я использую threading.local() в своем основном процессе для хранения данных, будут ли они скопированы в процессы, запущенные с использованием concurrent.futures.ProcessPoolExecutor?

В документации thread-local-data указано локальные данные этого потока не разделяются между потоками. Тем не менее, в нем не упоминается, если / как оно используется несколькими потоками в разных процессах.

Логически, я бы подумал, что ответом на этот вопрос будет «нет». Но я не смог найти четкую документацию по этому варианту использования.

1 Ответ

0 голосов
/ 23 марта 2020

Да, данные будут скопированы в дочерние процессы, если они будут запущены с fork (по умолчанию в unix системах).

Это кажется не интуитивно понятным, но можно показать на довольно простом примере:

import concurrent.futures
import multiprocessing
import threading

thread_data = threading.local()


def work():
    print("[{}] [{}] {}".format(
        multiprocessing.current_process().name,
        threading.current_thread().getName(),
        getattr(thread_data, 'my_data', None)
    ), flush=True)


def main():
    thread_data.my_data = 'Data from {}'.format(multiprocessing.current_process().name)

    work()

    with concurrent.futures.ProcessPoolExecutor() as executor:
        futures = []
        for i in range(8):
            futures.append(executor.submit(work))
        for _ in concurrent.futures.as_completed(futures):
            print("[{}] [{}] Work done.".format(
                multiprocessing.current_process().name,
                threading.current_thread().getName()
            ), flush=True)


if __name__ == "__main__":
    main()

Результат:

[MainProcess] [MainThread] Data from MainProcess
[ForkProcess-1] [MainThread] Data from MainProcess
[ForkProcess-2] [MainThread] Data from MainProcess
[ForkProcess-3] [MainThread] Data from MainProcess
[ForkProcess-4] [MainThread] Data from MainProcess
[MainProcess] [MainThread] Work done.
[ForkProcess-5] [MainThread] Data from MainProcess
[ForkProcess-6] [MainThread] Data from MainProcess
[MainProcess] [MainThread] Work done.
[ForkProcess-7] [MainThread] Data from MainProcess
[MainProcess] [MainThread] Work done.
[ForkProcess-8] [MainThread] Data from MainProcess
[MainProcess] [MainThread] Work done.
[MainProcess] [MainThread] Work done.
[MainProcess] [MainThread] Work done.
[MainProcess] [MainThread] Work done.
[MainProcess] [MainThread] Work done.

Process finished with exit code 0

Обратите внимание, что thread_data.my_data установлено в главном потоке основного процесса. После запуска пула процессов и отправки работы дочерний процесс все еще имеет доступ к локальным данным потока из родительского процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...