Итак, у меня есть следующий код
import time
from multiprocessing import Process
from multiprocessing import JoinableQueue as Queue
def checker(q):
while True:
data = q.get()
if data is None:
return
if __name__ == '__main__':
t = time.time()
q = Queue()
for i in range(500000):
q.put(i)
procs = []
for _ in range(4):
q.put(None)
p = Process(target=checker, args=(q,), daemon=True)
# p = Thread(target=checker, args=(q,))
p.start()
procs.append(p)
for p in procs:
p.join()
print(time.time() - t)
Когда я запускаю эту программу с 4 параллельными процессами, она занимает около 4.14
секунд, а когда она запускается только с одним процессомзанимает около 3.7
секунд.
То же самое происходит с несколькими потоками, работающими одновременно.
Мое возможное объяснение этого поведения состоит в том, что, поскольку queues
являются multithreading
и multiprocessing
безопаснымии имеют встроенную реализацию мьютекса, только один thread
или process
может получить доступ к очереди за один раз.
Таким образом, при использовании одного процесса / потока интерпретатор или процессор python
не может сделать упреждения, чтобы гарантировать, что каждый поток / процесс получает равные возможности для запуска своего кода, но несколько процессов / потоковСтоимость этого вытеснения увеличивает общее время выполнения программы.
Поэтому я думаю о правильных строках или это происходит из-за чего-то другого.