Python threading多线程编程实例

 更新时间:2014年09月18日 09:53:54   投稿:junjie  
这篇文章主要介绍了Python threading多线程编程实例,本文讲解了使用函数和线程类实现多线程编程的例子,需要的朋友可以参考下

Python 的多线程有两种实现方法:

函数,线程类

1.函数

调用 thread 模块中的 start_new_thread() 函数来创建线程,以线程函数的形式告诉线程该做什么

复制代码 代码如下:

# -*- coding: utf-8 -*-
import thread
def f(name):
  #定义线程函数
  print "this is " + name
 
if __name__ == '__main__':
  thread.start_new_thread(f, ("thread1",))
  #用start_new_thread()调用线程函数和其他参数
  while 1:
    pass

不过这种方法暂时没能找到其他辅助方法,连主线程等待都要用 while 1 这种方法解决。

2.线程类

调用 threading 模块,创建 threading.Thread 的子类来得到自定义线程类。

复制代码 代码如下:

# -*- coding: utf-8 -*-
import threading
class Th(threading.Thread):
  def __init__(self, name):
    threading.Thread.__init__(self)
    self.t_name = name
    #调用父类构造函数
 
  def run(self):
    #重写run()函数,线程默认从此函数开始执行
    print "This is " + self.t_name
 
if __name__ == '__main__':
  thread1 = Th("Thread_1")
  thread1.start()
  #start()函数启动线程,自动执行run()函数

threading.Thread 类的可继承函数:
getName() 获得线程对象名称
setName() 设置线程对象名称
join() 等待调用的线程结束后再运行之后的命令
setDaemon(bool) 阻塞模式, True: 父线程不等待子线程结束, False 等待,默认为 False
isDaemon() 判断子线程是否和父线程一起结束,即 setDaemon() 设置的值
isAlive() 判断线程是否在运行

实例

复制代码 代码如下:

import threading
import time
class Th(threading.Thread):
  def __init__(self, thread_name):
    threading.Thread.__init__(self)
    self.setName(thread_name)
 
  def run(self):
    print "This is thread " + self.getName()
    for i in range(5):
      time.sleep(1)
      print str(i)
    print self.getName() + "is over"

join() 阻塞等待

复制代码 代码如下:

if __name__ == '__main__':
    thread1 = Th("T1 ")
    thread1.start()
    #thread1.join()
    print "main thread is over"

不带 thread1.join() ,得到如下结果:

复制代码 代码如下:

This is thread T1
main thread is over
0
1
2
T1 is over

不等待 thread1 完成,执行之后语句。
加了 thread1.join() ,得到如下结果:
复制代码 代码如下:

This is thread T1
0
1
2
T1 is over
main thread is over

阻塞等待 thread1 结束,才执行下面语句

主线程等待

复制代码 代码如下:

if __name__ == '__main__':
  thread1 = Th("T1 ")
  thread1.setDaemon(True)
  #要在线程执行之前就设置这个量
  thread1.start()
  print "main thread is over"

报错: Exception in thread T1 (most likely raised during interpreter shutdown):
也就是主线程不等待子线程就结束了。

多个子线程

复制代码 代码如下:

if __name__ == '__main__':
    for i in range(3):
        t = Th(str(i))
        t.start()
    print "main thread is over"

这里的 t 可同时处理多个线程,即 t 为线程句柄,重新赋值不影响线程。

这里奇怪的是,运行 t.run() 时,不会再执行其他线程。虽不明,还是用 start() 吧。暂且理解为 start() 是非阻塞并行的,而 run 是阻塞的。

线程锁

threading 提供线程锁,可以实现线程同步。

复制代码 代码如下:

import threading
import time
class Th(threading.Thread):
  def __init__(self, thread_name):
    threading.Thread.__init__(self)
    self.setName(thread_name)
 
  def run(self):
    threadLock.acquire()
    #获得锁之后再运行
    print "This is thread " + self.getName()
    for i in range(3):
      time.sleep(1)
      print str(i)
    print self.getName() + " is over"
    threadLock.release()
    #释放锁
if __name__ == '__main__':
  threadLock = threading.Lock()
  #设置全局锁
  thread1 = Th('Thread_1')
  thread2 = Th('Thread_2')
  thread1.start()
  thread2.start()

得到结果:

复制代码 代码如下:

This is thread Thread_1
0
1
2
Thread_1 is over
This is thread Thread_2
0
1
2
Thread_2 is over

相关文章

  • 修改Pandas的行或列的名字(重命名)

    修改Pandas的行或列的名字(重命名)

    这篇文章主要介绍了修改Pandas的行或列的名字(重命名),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Python pandas.replace的用法详解

    Python pandas.replace的用法详解

    在处理数据的时候,很多时候会遇到批量替换的情况,如果一个一个去修改效率过低,也容易出错,replace()是很好的方法,下面这篇文章主要给大家介绍了关于Python pandas.replace用法的相关资料,需要的朋友可以参考下
    2022-06-06
  • Python 监测文件是否更新的方法

    Python 监测文件是否更新的方法

    今天小编就为大家分享一篇Python 监测文件是否更新的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python numpy.linalg.norm函数的使用及说明

    python numpy.linalg.norm函数的使用及说明

    这篇文章主要介绍了python numpy.linalg.norm函数的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Python 3 使用Pillow生成漂亮的分形树图片

    Python 3 使用Pillow生成漂亮的分形树图片

    这篇文章主要介绍了Python 3 使用Pillow生成漂亮的分形树图片,本文通过实例代码介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • pandas将numpy数组写入到csv的实例

    pandas将numpy数组写入到csv的实例

    今天小编就为大家分享一篇pandas将numpy数组写入到csv的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • python dataframe向下向上填充,fillna和ffill的方法

    python dataframe向下向上填充,fillna和ffill的方法

    今天小编就为大家分享一篇python dataframe向下向上填充,fillna和ffill的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python绘制动态水球图过程详解

    Python绘制动态水球图过程详解

    这篇文章主要介绍了Python绘制动态水球图过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • PO模式在selenium自动化测试框架的优势

    PO模式在selenium自动化测试框架的优势

    大家都知道po模式可以提高代码的可读性和减少了代码的重复,但是相对的缺点还有,今天通过本文一起学习下PO模式在selenium自动化测试框架的优势,需要的朋友可以参考下
    2022-03-03
  • 如何让python程序正确高效地并发

    如何让python程序正确高效地并发

    这篇文章主要介绍了如何让python程序正确高效地并发,文章围绕主题的相关资料展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06

最新评论