python ‘多线程’

2019-12-16  本文已影响0人  自由调优师_大废废

python 的多线程是通过 threading 模块的 Thread 类来实现的。

import threading
import time

def thread1(name):
   print('你好, %s, %s' % (name, time.ctime()))
   time.sleep(2)
   print('结束, %s, %s' % (name, time.ctime()))

def thread2(name):
   print('你好, %s, %s' % (name, time.ctime()))
   time.sleep(3)
   print('结束, %s, %s' % (name, time.ctime()))

if __name__ == '__main__':
   t1 = threading.Thread(target=thread1, args=('thread1',))
   t1.start()
   t2 = threading.Thread(target=thread1, args=('thread2',))
   t2.start()

   print('程序结束:%s' % time.ctime())

执行结果:


image.png

我们可以发现,主线程的 print 并不是等 t1、t2 线程都执行完之后再打印的,这是因为主线程和 t1、t2 线程是同时跑的。但是主进程要等非守护子线程结束之后,主线程才会退出。

join

if __name__ == '__main__':
    t1 = threading.Thread(target=thread1, args=('thread1',))
    t1.start()
    t2 = threading.Thread(target=thread1, args=('thread2',))
    t2.start()
    
    t1.join() #join等t1子线程结束
    t2.join() #join等t2子线程结束
    print('程序结束:%s' % time.ctime())

执行结果:


image.png

我们可以看到,主线程 print 最后才执行的。主线程执行了打印操作和主线程结束不是一个概念,如果子线程不加 join,则主线程也会执行打印,但是主线程不会结束,还是需要待非守护子线程结束之后,主线程才结束。

守护线程

t1 为守护进程:

if __name__ == '__main__':
    t1 = threading.Thread(target=thread1, args=('thread1',))
    t1.setDaemon(True)
    t1.start()

    t2 = threading.Thread(target=thread1, args=('thread2',))
    t2.start()

    print('程序结束:%s' % time.ctime())

执行结果:


image.png
if __name__ == '__main__':
    t1 = threading.Thread(target=thread1, args=('thread1',))
    t1.start()

    t2 = threading.Thread(target=thread1, args=('thread2',))
    t2.setDaemon(True)
    t2.start()

    print('程序结束:%s' % time.ctime())

执行结果:


image.png

线程方法

threading模块提供的一些方法:

python 中的 ‘多线程’ - GIL

我们注意到两如果个任务如果顺序执行要 5s 结束,如果是多线程执行 3S 结束,性能是有所提升的,但是我们要知道这里的性能提升实际上是由于 cpu 并发实现性能提升,也就是 cpu 线程切换(多道技术)带来的,而并不是真正的多cpu并行执行。

为什么 python 在多线程中为什么不能实现真正的并行操作呢?就是在多 cpu 中执行不同的线程, java 中多个线程可以在不同的 cpu 中,实现并行运行。

我们在之前的代码中用了 sleep 操作,其实就是相当于遇到 IO,这种场景用多线程是可以增加性能的,但是如果我们用多线程来计算数据的计算,性能反而会降低。

上一篇 下一篇

猜你喜欢

热点阅读