线程模块和多处理模块的比较

所以我试图比较threading是更快还是multiprocessing。理论上,由于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)


qq_花开花谢_0
浏览 122回答 2
2回答

呼如林

由于 GIL 的存在,仅当您执行计算密集型任务时,添加到 @zmbq 线程才会更慢。如果您的操作是 I/O 绑定的并且很少有其他类似的操作,那么线程肯定会更快,因为涉及的开销更少。请参阅以下博客以更好地理解相同的内容。作为数据科学家利用 Python 中的多处理和多线程希望这可以帮助!

偶然的你

这不是一个适当的测试。time.sleep可能不会获得 GIL,因此您正在运行并发线程与并发进程。线程更快,因为没有启动成本。您应该在线程中执行一些计算,然后您会看到差异。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python