python多线程

关于python多线程,需要知道如下几个点:

  1. 一般使用threading模块即可,
  2. 使用threading.current_thread().name 查看当前线程名称
  3. t.setDaemon(True)表示这是一个守护线程,也就是不重要的线程,主线程结束后守护线程也被结束掉,
    不写这句的话,主线程结束后子线程还会继续执行下去
  4. t.join()表示主线程执行到这一句的时候挂起等待,直到子线程t完成后主线程再往后执行下去,

默认情况

def pt(sec):
      time.sleep(sec)
      print('{} is running!'.format(threading.current_thread().name))
t=threading.Thread(target=pt, args=(3,))
t.start()
print('main thread end..')
>>main thread end..
Thread-1 is running!

可以看到主线程比子线程早结束,并且主线程结束后子线程还是会执行下去的

守护线程

def pt(sec):
      time.sleep(sec)
      print('{} is running!'.format(threading.current_thread().name))
t=threading.Thread(target=pt, args=(3,))
t.setDaemon(True)
t.start()
print('main thread end..')
>>main thread end..

设置了守护线程后,主线程完成后子线程也被结束了,子线程没法继续执行下去

使用join

def pt(sec):
      time.sleep(sec)
      print('{} is running!'.format(threading.current_thread().name))
t=threading.Thread(target=pt, args=(3,))
t.start()
t.join()
print('main thread end..')
>>Thread-1 is running!
main thread end..

join的效果就是,主线程执行到这的时候不会继续往下跑了, 而是等到子线程t完成后再往下跑,在子线程join的情况下,t.setDaemon(True)不再生效。
再考虑一种情况,如果有两个子线程,一个join一个没有,会怎样?

def pt(sec):
      time.sleep(sec)
      print('{} is running!'.format(threading.current_thread().name))
t=threading.Thread(target=pt, args=(3,))
t2=threading.Thread(target=pt, args=(9,))
t.start()
t2.start()
t.join()
print('main thread end..')
>>Thread-1 is running!
main thread end..
Thread-2 is running!

果然如此,子线程2没有join,所以主线程没有等它就往下跑了,子线程2时最后才输出的。
注意:setDaemon(True)的效果要使用python aa.py 的命令方式执行才能看到,在idle里执行会有问题

如果要一段代码在同一时间只能有一个线程执行,那么可以使用lock.acquire() 和lock.release() 包裹住这段代码

lock=threading.Lock()
def pt():
    lock.acquire()
    for i in range(5):
        print('{} is running! '.format(threading.current_thread().name))
    lock.release()

t1=threading.Thread(target=pt)
t2=threading.Thread(target=pt)
t1.start()
t2.start()
print('main thread end...')
>>Thread-1 is running!
 Thread-1 is running! main thread end...

Thread-1 is running!
Thread-1 is running!
Thread-1 is running!
Thread-2 is running!
Thread-2 is running!
Thread-2 is running!
Thread-2 is running!
Thread-2 is running!

这样的话线程1和2就不会互相影响,被acquire和release包住的部分,会由一个线程执行完,其他的线程才能执行

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一文读懂Python多线程 1、线程和进程 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运...
    星丶雲阅读 5,351评论 0 4
  • Python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序...
    今早上阅读 2,750评论 0 0
  • 环境 xubuntu anaconda pycharm python https://www.cnblogs.co...
    Ericoool阅读 5,895评论 0 0
  • 关于Python多线程的概述 由于GIL的存在,Python的多线程在CPU密集型任务并没有多大的优势,任何Pyt...
    千鸟月读阅读 3,529评论 0 0
  • 1、线程和进程 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 假定工厂的电力有限,一...
    文哥的学习日记阅读 14,834评论 0 9