Python创建线程
Python 提供了 _thread 和 threading 两个模块来支持多线程,其中 _thread 提供低级别的、原始的线程支持,以及一个简单的锁,正如它的名字所暗示的,一般编程不建议使用 thread 模块;而 threading 模块则提供了功能丰富的多线程支持。
Python 主要通过两种方式来创建线程:
使用 threading 模块的 Thread 类的构造器创建线程。 继承 threading 模块的 Thread 类创建线程类。 调用 Thread 类的构造器创建线程 调用 Thread 类的构造器创建线程很简单,直接调用 threading.Thread 类的如下构造器创建线程: __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *,daemon=None)
上面的构造器涉及如下几个参数:
group:指定该线程所属的线程组。目前该参数还未实现,因此它只能设为 None。
target:指定该线程要调度的目标方法。
args:指定一个元组,以位置参数的形式为 target 指定的函数传入参数。元组的第一个元素传给 target 函数的第一个参数,元组的第二个元素传给 target 函数的第二个参数……依此类推。
kwargs:指定一个字典,以关键字参数的形式为 target 指定的函数传入参数。
daemon:指定所构建的线程是否为后代线程。
通过 Thread 类的构造器创建井启动多线程的步骤如下:
调用 Thread 类的构造器创建线程对象。在创建线程对象时,target 参数指定的函数将作为线程执行体。
调用线程对象的 start() 方法启动该线程。
下面程序示范了通过 Thread 类的构造器来创建线程对象:
import threading # 定义一个普通的action函数,该函数准备作为线程执行体
def action(max):
for i in range(max):
# 调用threading模块current_thread()函数获取当前线程
# 线程对象的getName()方法获取当前线程的名字
print(threading.current_thread().getName() + " " + str(i))
# 下面是主程序(也就是主线程的执行体)
for i in range(100):
# 调用threading模块current_thread()函数获取当前线程
print(threading.current_thread().getName() + " " + str(i))
if i == 20:
# 创建并启动第一个线程
t1 =threading.Thread(target=action,args=(100,))
t1.start()
# 创建并启动第二个线程
t2 =threading.Thread(target=action,args=(100,))
t2.start()
print('主线程执行完成!')
上面程序中的主程序包含一个循环,当循环变量 i 等于 20 时创建并启动两个新线程:
创建了一个 Thread 对象,该线程的 target 为 action,这意味着它会将 action 函数作为线程执行体。接下来程序调用 start() 方法来启动t1线程。
再次创建了一个线程,其创建和启动方式与第一个线程完全相同。
运行上面程序,将会看到如图所示的界面。

虽然上面程序只显式创建并启动了两个线程,但实际上程序有三个线程,即程序显式创建的两个子线程和主线程。前面己经提到,当 Python 程序开始运行后,程序至少会创建一个主线程,主线程的线程执行体就是程序中的主程序(没有放在任何函数中的代码)。
从上图可以看出,此时程序中共包含三个线程,这三个线程的执行没有先后顺序,它们以并发方式执行:Thread-1 执行一段时间,然后可能 Thread-2 或 MainThread 获得 CPU 执行一段时间,接下来又换其他线程执行,这就是典型的线程并发执行,CPU 以快速轮换的方式在多个线程之间切换,从而给用户一种错觉,即多个线程似乎同时在执行。
通过上面介绍不难看出多线程的意义,如果不使用多线程,主程序直接调用两次 action() 函数,那么程序必须等第一次调用的 action() 函数执行完成,才会执行第二次调用的 action() 函数;必须等第二次调用的 action() 函数执行完成,才会继续向下执行主程序。
本文转载于https://www.py.cn/jishu/jichu/10902.html
Python创建线程的更多相关文章
- Python 创建线程的方法
使用的是 threading 模块 代码如下: 1 #!/usr/bin/python3 2 3 import threading 4 import time 5 6 exitFlag = 0 7 / ...
- python:threading多线程模块-创建线程
创建线程的两种方法: 1,直接调用threading.Thread来构造thread对象,Thread的参数如下: class threading.Thread(group=None, target= ...
- python 以面向对象的方式创建线程 实现售票系统
---恢复内容开始--- 转载或借鉴请注明转自http://www.cnblogs.com/FG123/p/5068556.html 谢谢! 通过面向对象的方法实现多线程,其核心是继承thread ...
- Python使用Threading模块创建线程
使用Threading模块创建线程,直接从threading.Thread继承,然后重写__init__方法和run方法: #!/usr/bin/python # -*- coding: UTF-8 ...
- python 多线程编程之threading模块(Thread类)创建线程的三种方法
摘录 python核心编程 上节介绍的thread模块,是不支持守护线程的.当主线程退出的时候,所有的子线程都将终止,不管他们是否仍在工作. 本节开始,我们开始介绍python的另外多线程模块thre ...
- python用类的方式创建线程---自创建类
用类的方式创建线程---自创建类 import threadingimport time class MyThread(threading.Thread):#自建MyThread类继承threadin ...
- Python创建进程、线程的两种方式
代码创建进程和线程的两种方式 """ 定心丸:Python创建进程和线程的方式基本都是一致的,包括其中的调用方法等,学会一个 另一个自然也就会了. "" ...
- Python并发编程之消息队列补充及如何创建线程池(六)
大家好,并发编程 进入第六篇. 在第四章,讲消息通信时,我们学到了Queue消息队列的一些基本使用.昨天我在准备如何创建线程池这一章节的时候,发现对Queue消息队列的讲解有一些遗漏的知识点,而这些知 ...
- Python 创建本地服务器环境生成二维码
一. 需求 公司要做一个H5手机端适配页面,因技术问题所以H5是外包的,每次前端给我们源码,我们把源码传到服务器让其他人访问看是否存在bug,这个不是很麻烦吗?有人说,可以让前端在他们的服务器上先托管 ...
随机推荐
- 2.线程--线程安全(synchronized)
同步锁:synchronized,(缺点:不能手动开锁 解锁) 1.同步代码块 public void run(){ synchronized(this){/使用this关键字表示同一把锁,非静态 ...
- BZOJ1941Hide and Seek
做KD_tree的入门题. 问题就是求出任意一个点距其他点的最大曼哈顿距离和最小曼哈顿距离差,然后对其取min即可. 这个东西就是KD_tree可以轻松解决的了. 下面总结一下做KD_tree(不带修 ...
- sqlmap环境搭建
1.安装Python2.7.12 1.1.下载Python2.7.12地址:https://www.python.org/downloads/ 1.2.环境变量配置Python2.7.11 1.3.验 ...
- C#实现获取当前文件路径的上级路径
界面: 声明: textBox1.Text为指定文件路径:string path = @"F:\ABB-pragram\ABB工作站\ABB Station\Systems\Situatio ...
- 你的Node应用,对接分布式链路跟踪系统了吗?(一) 原创: 金炳 Node全栈进阶 4天前 戳蓝字「Node全栈进阶」关注我们哦
你的Node应用,对接分布式链路跟踪系统了吗?(一) 原创: 金炳 Node全栈进阶 4天前 戳蓝字「Node全栈进阶」关注我们哦
- C#-片段-插入片段:测试
ylbtech-C#-片段-插入片段:测试 using Microsoft.VisualStudio.TestTools.UnitTesting; 1.返回顶部 ·测试方法 [Microsoft.Vi ...
- MHA集群搭建
(1).简介 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开 ...
- 123456123456#0#-----com.threeapp.xiongMaoPaoPao01----熊猫跑酷01
com.threeapp.xiongMaoPaoPao01----熊猫跑酷01
- lombok编译时注解@Slf4j的使用及相关依赖包
slf4j是一个日志门面模式的框架,只对调用者开放少量接口用于记录日志 主要接口方法有 debug warn info error trace 在idea中可以引入lombok框架,使用@Slf4j注 ...
- pycharm调用shell命令
在pycharm中调用shell命令 1.调用普通命令 # -*- coding:UTF-8 -*- import subprocess subprocess.call(["ls /home ...