многопроцессорность и многопоточность в python 3 - PullRequest
0 голосов
/ 24 марта 2020

Я знаю, что в python есть GIL, который заставляет потоки выполняться только на 1 ядре. Но я создал процессы по количеству процессорных ядер, и в каждом процессе я создаю потоки. Теоретически, будут ли они выполняться параллельно в каждом процессе? И если это работает, как я могу синхронизировать все при использовании пула

from multiprocessing import Pool
from concurrent.futures import ThreadPoolExecutor

def make_threads(data):
 with ThreadPoolExecutor(len(data)) as executor:
     answer=list(executor.map(some_function,data))
     return answer

def main():
with Pool(processes_count) as p:
         answer=list(p.map(make_threads,data))```

1 Ответ

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

Используйте concurrent.futures вместо многопроцессорной или многопоточности, если вы можете - это лучший API, который позволяет вам удобно переключаться с потоков на процессы или наоборот.

В рамках данного python процесса, потоки могут хорошо выполнять задачи, связанные с вводом / выводом, а задачи, связанные с процессором, плохо. И если у вас есть 20 потоков, связанных с вводом / выводом, и 1 поток с привязкой к ЦП в одном процессе, то у всех них будут проблемы с производительностью - поток с привязкой к ЦП испортит потоки, связанные с вводом / выводом.

Часто Очереди - лучший способ взаимодействия между процессами и потоками.

...