Сравнение между многопоточным модулем и многопроцессорным модулем - PullRequest
1 голос
/ 12 апреля 2020

Поэтому я пытаюсь сравнить, является ли многопоточность более быстрой или многопроцессорной . Теоретически из-за GIL многопроцессорная обработка должна выполняться быстрее, чем многопоточность, поскольку одновременно выполняется только один поток. Но я получаю противоположные результаты, т. Е. Многопоточность занимает меньше времени, чем многопроцессорная, что мне не хватает, помогите.

Ниже приведен код многопоточность

import threading
from queue import Queue
import time

print_lock = threading.Lock()

def exampleJob(worker):
    time.sleep(10)  
    with print_lock:
        print(threading.current_thread().name,worker)


def threader():
    while True:

        worker = q.get()


        exampleJob(worker)


        q.task_done()

q = Queue()

for x in range(4):
     t = threading.Thread(target=threader)

     print(x)
     t.daemon = True


     t.start()

start = time.time()


for worker in range(8):
    q.put(worker)


q.join()


print('Entire job took:',time.time() - start)

Ниже приведен код многопроцессорной обработки

import multiprocessing as mp
import time

def exampleJob(print_lock,worker):                 # function simulating some computation
    time.sleep(10)
    with print_lock:
        print(mp.current_process().name,worker)

def processor(print_lock,q):                       # function where process pick up the job
    while True:
        worker = q.get()
        if worker is None: # flag to exit the process
            break
        exampleJob(print_lock,worker)


if __name__ == '__main__':

    print_lock = mp.Lock()
    q = mp.Queue()
    processes = [mp.Process(target=processor,args=(print_lock,q)) for _ in range(4)]

    for process in processes:
        process.start()    

    start = time.time()
    for worker in range(8):
        q.put(worker)

    for process in processes:
        q.put(None) # quit indicator

    for process in processes:
        process.join()

    print('Entire job took:',time.time() - start)

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Это неправильный тест. time.sleep, вероятно, не получает GIL, поэтому вы используете параллельные потоки против параллельных процессов. Потоки быстрее, так как нет затрат на запуск.

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

0 голосов
/ 12 апреля 2020

Добавление к потокам @zmbq будет медленнее, только если вы выполняете задачу, требующую больших вычислительных ресурсов, из-за наличия GIL. Если ваши операции связаны с вводом-выводом и несколькими другими подобными операциями, то многопоточность будет определенно быстрее, так как это потребует меньше служебных данных Пожалуйста, обратитесь к следующему блогу для лучшего понимания того же.

Использование многопроцессорной обработки и многопоточности в Python в качестве ученого данных

Надеюсь, это поможет!

...