关于线程问题

来源:11-2 多线程编程 - threading

Demin

2020-03-27

老师,我可能对线程还没有理解透,平时开发过程中也没怎么用线程。
我就是有个疑惑,由于gil的存在,所有只有一个线程才会运行,你不管声明几个线程到最后也是只有一个线程在跑。我就总感觉不用线程也没有关系,比如我定义一个斐波那契数列f(),我反正是要算出最后的结果,你开多个线程给我跑结果和我直接用一个函数跑结果是一样的,反正就是一个线程在跑。 但我又觉得哪里不对,大学学的操作系统让我模糊记得单核CPU在一段时间片内,并行就是假的。
但我又觉得开线程程序就比没开线程快。是不是线程的优势在于,我声明n个线程,来回切线程,让人有个错觉好几个程序在跑,其实本事就是一个在跑?那我从线程1切刀线程2,那线程1是不是就停止了?那和我for循环里面开几个函数也差不多吧?
写的比较啰嗦,感觉不知道在问什么。老师看着回答就好

写回答

1回答

bobby

2020-03-28

  1. 斐波拉契是计算型的任务,就是耗cpu,这种只有利用多核的优势才行,也就是这个时候你利用多线程计算多个斐波拉契数列并不会显得快,因为gil的存在导致了一个线程只有一个斐波拉契计算,所以利用多线程时间也是一样的。


  2. def fib(k):
        if k == 1 or k == 2:
            return 1
        else:
            return fib(k-1)+fib(k-2)
    
    
    
    if __name__ == "__main__":
        from datetime import datetime
        import threading
    
        start_time = datetime.now()
        t1 = threading.Thread(target=fib, args=(35,))
        t2 = threading.Thread(target=fib, args=(36,))
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        print(f"多线程运行时间:{datetime.now()-start_time}")
    
        start_time = datetime.now()
        fib(35)
        fib(36)
        print(f"运行时间:{datetime.now() - start_time}")
    你可以看一下两者运行时间一样长
  3. 但是实际看的开发过程中大量的操作都是io操作,比如读数据库,网络请求等。这些耗时都远比cpu慢的多。所以虽然对于cpu来说并行还是同一时间运行一个线程,但是如果某一个线程在读文件或者访问数据库的时候可以切换出去那么这个线程的读取文件的过程和另一个线程的cpu操作是真正的并行的,具体为什么是并行你需要了解一下计算机的原理,cpu操作和文件读写操作是可以做到真正的并行的

1
1
Demin
非常感谢!
2020-03-28
共1条回复

Python3高级核心技术97讲,高级进阶的必学课程

socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO

2121 学习 · 551 问题

查看课程