美文网首页
python多线程

python多线程

作者: 代码表演艺术家 | 来源:发表于2019-05-06 15:13 被阅读0次

关于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包住的部分,会由一个线程执行完,其他的线程才能执行

相关文章

  • GIL

    谈谈python的GIL、多线程、多进程 最近在看 Python 的多线程,经常我们会听到老手说:“python下...

  • Python多线程编程——多线程编程中的加锁机制

    如果大家对Python中的多线程编程不是很了解,推荐大家阅读之前的两篇文章:Python多线程编程——多线程基础介...

  • 5-线程(补充)

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

  • Python_提高

    GIL全局解释器锁 描述Python GIL的概念, 以及它对python多线程的影响?编写⼀个 多线程抓取⽹⻚的...

  • Python程序员都知道的入门知识の八

    目录【Python程序员都知道的入门知识】 1. 多线程threading、Queue Python的多线程由th...

  • Python多线程实现生产者消费者

    1. Python多线程介绍 Python提供了两个有关多线程的标准库,thread和threading。thre...

  • 多线程

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

  • Python多线程(上)

    前言 说起Python的多线程,很多人都嗤之以鼻,说Python的多线程是假的多线程,没有用,或者说不好用,那本次...

  • Python 3中的多线程

    Python 3的多线程 Python 3的多线程模块threading在旧版_thread模块基础上进行了更高层...

  • Python 多线程抓取图片效率实验

    Python 多线程抓取图片效率实验 实验目的: 是学习python 多线程的工作原理,及通过抓取400张图片这种...

网友评论

      本文标题:python多线程

      本文链接:https://www.haomeiwen.com/subject/aoiroqtx.html