У меня есть скрипт, который выполняет определенную функцию многопоточностью. Теперь интересно иметь столько же параллельных потоков, сколько и процессорных ядер. Теперь текущий код ( 1: ) с использованием оператора threading.thread создает 1000 потоков и запускает их все одновременно. Я хочу превратить это во что-то, что запускает только фиксированное количество потоков одновременно (например, 8) и помещает остальное в очередь до тех пор, пока исполняемое ядро потока / процессора не станет бесплатным для использования.
1:
import threading
nSim = 1000
def simulation(i):
print(str(threading.current_thread().getName()) + ': '+ str(i))
if __name__ == '__main__':
threads = [threading.Thread(target=simulation,args=(i,)) for i in range(nSim)]
for t in threads:
t.start()
for t in threads:
t.join()
Q1: Код 2: делает то, что я описал? (многопоточность с максимальным количеством одновременно работающих потоков) Это правильно? (Я так думаю, но я не уверен на 100%)
Q2: Теперь код запускает 1000 потоков одновременно и выполняет их на 8 потоках. Есть ли способ инициировать новый поток только тогда, когда исполняемое ядро потока / процессора свободно для использования (для того, чтобы у меня не было 990 потоков вызовов, ожидающих с самого начала выполнения, когда это возможно?
Q3: Есть ли способ отследить, какое ядро процессора выполнило какой поток? Просто для доказательства того, что код делает то, что должен.
2:
import threading
import multiprocessing
print(multiprocessing.cpu_count())
from concurrent.futures import ThreadPoolExecutor
nSim = 1000
def simulation(i):
print(str(threading.current_thread().getName()) + ': '+ str(i))
if __name__ == '__main__':
with ThreadPoolExecutor(max_workers=8) as executor:
for i in range (nSim):
res = executor.submit(simulation, i)
print(res.result())