简体   繁体   English

CPU绑定任务中的多线程和单线程性能问题

[英]Multi-threading and Single-threading performance issues in CPU-bound task

The two following single-threading and multi-threading scripts are taking the same time when I give as input a big number like 555550000当我输入一个像555550000这样的大数字作为输入时,以下两个单线程和多线程脚本占用了相同的时间

single thread单线程

import threading, time
a=[]
def print_factors(x):
   for i in range(1, x + 1):
       if x % i == 0:
           a.append(i)

n=int(input("Please enter a large number"))
print ("Starting time is %s" % ( time.ctime(time.time()) ))
print("The factors of",n,"are:")
thread = threading.Thread(target=print_factors,args=(n,))
thread.start()
thread.join()
print("Finishing time is %s" % (time.ctime(time.time())))
print(a)

multi thread多线程

import threading, time
a=[]
def print_factors1(x):
   for i in range(1, int(x/2)):
       if x % i == 0:
           a.append(i)

def print_factors2(x):
    for i in range(int(x/2), x+1):
        if x % i == 0:
            a.append(i)

n=int(input("Please enter a large number"))
print ("Starting time is %s" % ( time.ctime(time.time()) ))
thread1 = threading.Thread(target=print_factors1,args=(n,))
thread2 = threading.Thread(target=print_factors2,args=(n,))
print("The factors of",n,"are:")
thread1.start()
thread2.start()
thread2.join()
print("Finishing time is %s" % (time.ctime(time.time())))
print(a)

I am trying to understand the difference between single-threading and multi-threading in terms of time taken to got the results.我试图了解单线程和多线程在获得结果所需时间方面的区别。
I'm measuring similar timings for both types and I cannot figuring out the reasons.我正在测量这两种类型的相似时间,但我无法找出原因。

Your problem is GIL, the Global Interpreter Lock.您的问题是 GIL,即全局解释器锁。

The Python Global Interpreter Lock or GIL, in simple words, is a mutex (or a lock) that allows only one thread to hold the control of the Python interpreter. Python 全局解释器锁或 GIL,简单来说,是一个互斥体(或锁),它只允许一个线程持有 Python 解释器的控制权。

You can found detailed informations about GIL here (just a fast search on Google and you can find a lot more sources):您可以在此处找到有关 GIL 的详细信息(只需在 Google 上快速搜索即可找到更多来源):

You need to change your implementation to use processes instead of threads.您需要更改实现以使用进程而不是线程。
I changed your script as follows:我将您的脚本更改如下:

from multiprocessing import Pool
import time
def print_factors1(x):
    a=[]
    for i in range(1, int(x/2)):
        if x % i == 0:
            a.append(i)
    return a

def print_factors2(x):
    a=[]
    for i in range(int(x/2), x+1):
        if x % i == 0:
            a.append(i)
    return a

if __name__ == '__main__':
    n=int(input("Please enter a large number"))
    pool = Pool(processes=2)
    print ("Starting time is %s" % ( time.ctime(time.time()) ))

    process1 = pool.apply_async(print_factors1,[n])
    process2 = pool.apply_async(print_factors2,[n])

    pool.close()
    pool.join()

    print("Finishing time is %s" % (time.ctime(time.time())))
    print("The factors of",n,"are:")
    print(process1.get())
    print(process2.get())

Take into account that threads share the memory, processes don't .考虑到线程共享 memory,进程共享。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM