Я искал это статья и тестирую то же самое в моем локальном:

import os
import time
import threading
import multiprocessing

NUM_WORKERS = 4

def only_sleep():
    print "PID: %s, Process Name: %s, Thread Name: %s" % (os.getpid(), multiprocessing.current_process(), threading.current_thread())
    time.sleep(2)

def crunch_numbers():
    print "PID: %s, Process Name: %s, Thread Name: %s" % (os.getpid(), multiprocessing.current_process(), threading.current_thread())
    x = 0
    while x < 10000000:
        x += 1

def main():

    start_time = time.time()
    for _ in range(NUM_WORKERS):
        only_sleep()
    end_time = time.time()

    print "serial time", end_time - start_time

    start_time = time.time()
    threads = [threading.Thread(target=only_sleep()) for _ in range(NUM_WORKERS)]
    [thread.start() for thread in threads]
    [thread.join() for thread in threads]
    end_time = time.time()

    print "Threads time = ", end_time - start_time

    start_time = time.time()
    processes = [multiprocessing.Process(target=only_sleep()) for _ in range(NUM_WORKERS)]
    [process.start() for process in processes]
    [process.join() for process in processes]
    end_time = time.time()

    print "Process time = ", end_time - start_time

if __name__ == '__main__':
    main()

Вот результат:

PID: 60230, Process Name: <_MainProcess(MainProcess, started)>, Thread Name: <_MainThread(MainThread, started 140735648224064)>
PID: 60230, Process Name: <_MainProcess(MainProcess, started)>, Thread Name: <_MainThread(MainThread, started 140735648224064)>
PID: 60230, Process Name: <_MainProcess(MainProcess, started)>, Thread Name: <_MainThread(MainThread, started 140735648224064)>
PID: 60230, Process Name: <_MainProcess(MainProcess, started)>, Thread Name: <_MainThread(MainThread, started 140735648224064)>
serial time 8.01504993439
PID: 60230, Process Name: <_MainProcess(MainProcess, started)>, Thread Name: <_MainThread(MainThread, started 140735648224064)>
PID: 60230, Process Name: <_MainProcess(MainProcess, started)>, Thread Name: <_MainThread(MainThread, started 140735648224064)>
PID: 60230, Process Name: <_MainProcess(MainProcess, started)>, Thread Name: <_MainThread(MainThread, started 140735648224064)>
PID: 60230, Process Name: <_MainProcess(MainProcess, started)>, Thread Name: <_MainThread(MainThread, started 140735648224064)>
Threads time =  8.01574707031
PID: 60230, Process Name: <_MainProcess(MainProcess, started)>, Thread Name: <_MainThread(MainThread, started 140735648224064)>
PID: 60230, Process Name: <_MainProcess(MainProcess, started)>, Thread Name: <_MainThread(MainThread, started 140735648224064)>
PID: 60230, Process Name: <_MainProcess(MainProcess, started)>, Thread Name: <_MainThread(MainThread, started 140735648224064)>
PID: 60230, Process Name: <_MainProcess(MainProcess, started)>, Thread Name: <_MainThread(MainThread, started 140735648224064)>
Process time =  8.0206348896

Ниже моя локальная конфигурация системы:

enter image description here

Все три последовательных, многопоточных, многопроцессорных процесса занимают одно и то же время. Может ли кто-нибудь помочь мне понять, почему это происходит.

1
sathish j 27 Окт 2019 в 13:59

1 ответ

Лучший ответ

Когда вы ссылаетесь на функцию, вы не должны вызывать ее:

threading.Thread(target=only_sleep()) 

Должно быть:

threading.Thread(target=only_sleep)

А также:

processes = [multiprocessing.Process(target=only_sleep()) for _ in range(NUM_WORKERS)]

Должно быть:

processes = [multiprocessing.Process(target=only_sleep) for _ in range(NUM_WORKERS)]

() используется для вызова функций.

2
Reut Sharabani 27 Окт 2019 в 11:02