Python: Многопоточность в многопроцессорной функции выполняется в том же ядре, что и многопроцессорная или родительская? - PullRequest
0 голосов
/ 06 августа 2020
def multiprocess_function():
   run = 0   
   while run == 0:
     for i in the range(100):

        #This will initiate 100 threads
        threading.Thread(target=sum, args=(i,0))

     time.sleep(10)

p1 = multiprocessing.Process(target=multiprocess_function)
p1.start

В приведенном выше фрагменте кода я запускаю новый бесконечный процесс l oop (на отдельном ядре (скажем, №2)). В рамках этой функции я запускаю 100 потоков. Будут ли потоки выполняться на одном ядре # 2 или оно будет выполняться на основном python ядре?

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

1 Ответ

0 голосов
/ 06 августа 2020

Все потоки выполняются в процессе, из которого они были запущены. В этом случае процесс p1.

Что касается того, сколько потоков вы можете запустить в процессе, вы должны иметь в виду, что в CPython только один поток единовременно может выполняться Python байт-код . Это обеспечивается глобальной блокировкой интерпретатора («GIL»). Поэтому для заданий, требующих большого количества вычислений, обычно лучше использовать процессы, а не потоки.

Если вы посмотрите документацию для concurrent.futures.ThreadPoolExecutor, по умолчанию количество рабочих потоков, которые он использует, в пять раз больше. количество физических процессоров. По всей видимости, это разумное количество для тех видов рабочих нагрузок, для которых предназначен ThreadPoolExecutor.

...