为什么程序执行时间与以前相同?

时间:2019-06-10 15:27:28

标签: python python-multithreading

由于某种原因,执行时间仍然与不使用线程的时间相同。

但是,如果我添加类似time.sleep(secs)的内容,则显然在目标def d内部有线程。

def d(CurrentPos, polygon, angale, id):

    Returnvalue = 0
    lock = True
    steg = 0.0005
    distance = 0
    x = 0
    y = 0

    while lock == True:
        x = math.sin(math.radians(angale)) * distance + CurrentPos[0]
        y = math.cos(math.radians(angale)) * distance + CurrentPos[1]
        Localpoint = Point(x, y)
        inout = polygon.contains(Localpoint)
        distance = distance + steg
        if inout == False:
            lock = False

    l = LineString([[CurrentPos[0], CurrentPos[1]],[x,y]])
    Returnvalue = list(l.intersection(polygon).coords)[0]
    Returnvalue = calculateDistance(CurrentPos[0], CurrentPos[1], 
    Returnvalue[0], Returnvalue[1])

    with Arraylock:
        ReturnArray.append(Returnvalue)
        ReturnArray.append(id)



def Main(CurrentPos, Map):

    threads = []
    for i in range(8):
        t = threading.Thread(target = d, name ='thread{}'.format(i), args = 
        (CurrentPos, Map, angales[i], i))
        threads.append(t)
        t.start()
    for i in threads:
        i.join()

1 个答案:

答案 0 :(得分:2)

欢迎来到the Global Interpreter Lock a.k.a. GIL的世界。您的函数看起来像是受CPU约束的代码(一些计算,循环,if,内存访问等)。抱歉,您不能使用线程来提高CPU绑定任务的性能。这是Python的局限性。

Python中有一些发布GIL的函数,例如磁盘I / O,网络I / O和您实际尝试过的一个:睡眠。实际上,线程确实可以提高I / O绑定任务的性能。但是算术和/或内存访问不会在Python中并行运行。

标准解决方法是使用进程而不是线程。但是,由于过程之间的通讯不那么容易,所以这通常很痛苦。您可能还需要考虑使用某些低级库,例如numpy,它在某些情况下实际上会释放GIL(您只能在C级上执行此操作,GIL无法从Python本身访问),或者使用其他语言没有这个限制,例如C#,Java,C,C ++等。