详解Python并发编程之创建多线程的几种方法


Posted in Python onAugust 23, 2019

大家好,并发编程 今天开始进入第二篇。

今天的内容会比较基础,主要是为了让新手也能无障碍地阅读,所以还是要再巩固下基础。学完了基础,你们也就能很顺畅地跟着我的思路理解以后的文章。

本文目录

  • 学会使用函数创建多线程
  • 学会使用类创建多线程
  • 多线程:必学函数讲解

经过总结,Python创建多线程主要有如下两种方法:

  • 函数

接下来,我们就来揭开多线程的神秘面纱。

. 学会使用函数创建多线程

在Python3中,Python提供了一个内置模块 threading.Thread,可以很方便地让我们创建多线程。

threading.Thread() 一般接收两个参数:

  • 线程函数名:要放置线程让其后台执行的函数,由我们自已定义,注意不要加();
  • 线程函数的参数:线程函数名所需的参数,以元组的形式传入。若不需要参数,可以不指定。

举个例子

import time
 from threading import Thread
 
 # 自定义线程函数。
 def main(name="Python"):
   for i in range(2):
     print("hello", name)
     time.sleep(1)
# 创建线程01,不指定参数
thread_01 = Thread(target=main)
# 启动线程01
thread_01.start()


# 创建线程02,指定参数,注意逗号
thread_02 = Thread(target=main, args=("MING",))
# 启动线程02
thread_02.start()

可以看到输出

hello Python
hello MING
hello Python
hello MING

是不是超级简单呢?别急,下面也是一样简单。

. 学会使用类创建多线程

相比较函数而言,使用类创建线程,会比较麻烦一点。

首先,我们要自定义一个类,对于这个类有两点要求,

  • 必须继承 threading.Thread 这个父类;
  • 必须覆写 run 方法。

这里的 run 方法,和我们上面线程函数的性质是一样的,可以写我们的业务逻辑程序。在 start() 后将会调用。

来看一下例子

为了方便对比,run函数我复用上面的main。

import time
 from threading import Thread
 
 class MyThread(Thread):
   def __init__(self, name="Python"):
     # 注意,super().__init__() 一定要写
     # 而且要写在最前面,否则会报错。
     super().__init__()
     self.name=name

  def run(self):
    for i in range(2):
      print("hello", self.name)
      time.sleep(1)

if __name__ == '__main__':
  # 创建线程01,不指定参数
  thread_01 = MyThread()
  # 创建线程02,指定参数
  thread_02 = MyThread("MING")

  thread_01.start()
  thread_02.start()

当然结果也是一样的。

hello Python
hello MING
hello Python
hello MING

. 多线程:必学函数讲解

学完了两种创建线程的方式,你一定会惊叹,咋么这么简单,一点难度都没有。

其实不然,上面我们的线程函数 为了方便理解,都使用的最简单的代码逻辑。而在实际使用当中,多线程运行期间,还会出现诸多问题,只是我们现在还没体会到它的复杂而已。

不过,你也不必担心,在后面的章节中,我会带着大家一起来探讨一下,都有哪些难题,应该如何解决。

磨刀不误吹柴工,我们首先得来认识一下,Python给我们提供的 Thread 都有哪些函数和属性,实现哪些功能。学习完这些,在后期的学习中,我们才能更加得以应手。

经过我的总结,大约常用的方法有如下这些:

t=Thread(target=func)
 
 # 启动子线程
 t.start()
 
 # 阻塞子线程,待子线程结束后,再往下执行
 t.join()
 
 # 判断线程是否在执行状态,在执行返回True,否则返回False
t.is_alive()
t.isAlive()

# 设置线程是否随主线程退出而退出,默认为False
t.daemon = True
t.daemon = False

# 设置线程名
t.name = "My-Thread"

好了,Python线程基础知识,我们大概都介绍完了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之做一个小游戏
Sep 28 Python
python静态方法实例
Jan 14 Python
Python正则获取、过滤或者替换HTML标签的方法
Jan 28 Python
Python使用Scrapy保存控制台信息到文本解析
Dec 27 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
Python中的取模运算方法
Nov 10 Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
Apr 03 Python
python字符串分割及字符串的一些常规方法
Jul 24 Python
Python利用WMI实现ping命令的例子
Aug 14 Python
学Python 3的理由和必要性
Nov 19 Python
Python进行区间取值案例讲解
Aug 02 Python
详解Python并发编程之从性能角度来初探并发编程
Aug 23 #Python
python Kmeans算法原理深入解析
Aug 23 #Python
Python高级特性 切片 迭代解析
Aug 23 #Python
Python 合并多个TXT文件并统计词频的实现
Aug 23 #Python
Python 调用 Windows API COM 新法
Aug 22 #Python
详解Python文件修改的两种方式
Aug 22 #Python
详解python中的生成器、迭代器、闭包、装饰器
Aug 22 #Python
You might like
php用数组返回无限分类的列表数据的代码
2010/08/08 PHP
打造超酷的PHP数据饼图效果实现代码
2011/11/23 PHP
CodeIgniter表单验证方法实例详解
2016/03/03 PHP
理解 JavaScript 预解析
2009/10/25 Javascript
jQuery插件实现表格隔行换色且感应鼠标高亮行变色
2013/09/22 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
2014/01/03 Javascript
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
JavaScript 面向对象与原型
2015/04/10 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
深入了解JavaScript的逻辑运算符(与、或)
2016/12/20 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
javascript for循环性能测试示例
2019/08/07 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
Python实现的凯撒密码算法示例
2018/04/12 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
vue学习笔记之动态组件和v-once指令简单示例
2020/02/29 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
葡萄牙语专业个人求职信
2013/12/10 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
爱之链教学反思
2014/04/30 职场文书
人事任命书格式
2014/06/05 职场文书
门面房租房协议书
2014/08/20 职场文书
小学运动会入场词
2015/07/18 职场文书
趣味运动会广播稿
2015/08/19 职场文书
python中pandas对多列进行分组统计的实现
2021/06/18 Python