Да, данные будут скопированы в дочерние процессы, если они будут запущены с 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
установлено в главном потоке основного процесса. После запуска пула процессов и отправки работы дочерний процесс все еще имеет доступ к локальным данным потока из родительского процесса.