linux查看python线程,Python多线程详解
线程概念:
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程可以分为两类:
内核线程:由操作系统内核创建和撤销。
用户线程:不需要内核支持而在用户程序中实现的线程。
全局解释性锁(GIL):
在讲Python多线程,有一个绕不开的东西,叫全局解释性锁(Global Interpreter Lock)。这东西导致了无论你启多少个线程,你有多少个cpu, Python在执行的时候同一时刻只允许一个线程运行。这就导致了大家对Python多线程的印象普遍就是‘鸡肋“。
需要注意的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL。
线程模块:
Python3 通过两个标准库 _thread 和 threading 提供对线程的支持。_thread 提供了低级别的、原始的线程以及一个简单的锁,它相比于 threading 模块的功能还是比较有限的。threading 模块除了包含 _thread 模块中的所有方法外,还提供的其他方法:
threading.currentThread(): 返回当前的线程变量。
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:
run(): 用以表示线程活动的方法。
start():启动线程活动。
join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
isAlive(): 返回线程是否活动的。
getName(): 返回线程名。
setName(): 设置线程名。
Python threading模块:
(1)线程创建方式一:直接调用线程,创建Thread类,并传递一个需要多线程运行的函数。示例如下:
import threading
import time
def func(no):
time.sleep(2)
print("the thread number:%s"%no)
time_start = time.time()
thread_list = []
for i in range(10):
t = threading.Thread(target=func,args=(i,)) #生成线程实例
t.start() #启动线程
thread_list.append(t)
for t in thread_list:
t.join() #等待线程中止
time_end = time.time()
print("程序总共运行%d秒"%int(time_end-time_start))
#运行结果:
the thread number:4
the thread number:2
the thread number:5
the thread number:1
the thread number:3
the thread number:0
the thread number:7
the thread number:9
the thread number:6
the thread number:8
程序总共运行2秒
(2)线程创建方式二:继承式调用,创建一个Thread类的子类,并重写Thread类的run方法。示例如下:
import threading
import time
class TestThread(threading.Thread):
def __init__(self,no):
threading.Thread.__init__(self)
self.no = no
def run(self): #重写父类Thread的run方法,改方法内定义每个线程要运行的程序代码
time.sleep(2)
print("the thread number:%s" % self.no)
for i in range(10):
t = TestThread(i)
t.start()
(3)守护进程:
import threading
import time
def run(i):
print("run({}) start".format(i))
time.sleep(2)
print("run({}) end".format(i))
def main():
for i in range(5):
t = threading.Thread(target=run,args=(i,))
t.start()
m = threading.Thread(target=main,args=())
m.setDaemon(False)
m.start()
m.join(timeout=1)
print("main thread end")
# m.setDaemon(True) 运行结果:
run(0) start
run(1) start
run(2) start
run(3) start
run(4) start
main thread end
# m.setDaemon(False) 运行结果:
run(0) start
run(1) start
run(2) start
run(3) start
run(4) start
main thread end
run(3) end
run(2) end
run(0) end
run(4) end
run(1) end
从上述示例中可以看出:将main线程设置为Daemon线程,它做为程序主线程的守护线程,当主线程退出时,m线程也会退出,由m启动的其它子线程会同时退出,不管是否执行完任务
(4)线程同步(线程锁):一个进程下可以启动多个线程,多个线程共享父进程的内存空间,也就意味着每个线程可以访问同一份数据,很容易造成数据不同步。使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间。示例如下:
import threading
import time
def add():
global num #获取全局变量
time.sleep(1)
Lock.acquire() #修改全局变量前获取锁(加锁)
num -= 1
Lock.release() #修改后释放锁
Lock = threading.Lock() #生成一个全局锁
num = 100 #设置一个共享数据
thread_list = []
for i in range(100):
t = threading.Thread(target=add,args=())
t.start()
thread_list.append(t)
for t in thread_list:
t.join()
print("final num:",num)
#运行结果:
在未加锁前结果不一定是 0
加锁后运行结果一定是 0
linux查看python线程,Python多线程详解相关推荐
- linux shell 端口占用,linux 查看端口占用命令实例详解
linux 查看端口占用命令实例详解 端口是系统非常重要的一个东东,我们经常需要查看哪个进程占用了哪个端口,或者哪个端口被哪个进程占用.废话不多说,直接上干货,教大家怎样查看系统端口占用情况. 方法一 ...
- python可以开多少线程_python多线程详解
python多线程详解 一.线程介绍 什么是线程 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位.线程自己不拥有系统资源,只拥有一 ...
- linux查看和结束进程,Linux查看和结束进程命令详解
在ubuntu中,终止一个进程或终止一个正在运行的程序,一般是通过 kill .killall.pkill.xkill 等进行. ----------------------------------- ...
- python 线程等待_详解python多线程之间的同步(一)
引言: 线程之间经常需要协同工作,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直到该线程完成对数据的操作.这些技术包括临界区(Critical Section),互斥量(Mute ...
- linux 查看删除进程 ps命令详解
ps命令详解 名称:ps 使用权限:所有使用者 使用方式:ps [options] [--help] 说明:显示瞬间行程 (process) 的动态 参数:ps的参数非常多, 在此仅列出几个常用的参数 ...
- linux 查看网络流量来源_详解Linux查看实时网卡流量的几种方式
在工作中,我们经常需要查看服务器的实时网卡流量.通常,我们会通过这几种方式查看Linux服务器的实时网卡流量. 1. sar -n DEV 1 2 sar命令包含在sysstat工具包中,提供系统的众 ...
- linux下查看系统硬件,Linux 查看系统硬件信息 Linux 查看系统硬件信息(实例详解)...
linux查看系统的硬件信息,并不像windows那么直观,这里我罗列了查看系统信息的实用命令,并作了分类,实例解说.html cpu lscpu命令,查看的是cpu的统计信息.linux blue@ ...
- 很多人现在还不知道的知识点,Python多进程和多线程详解!
1 单进程单线程:一个人在一个桌子上吃菜. 2 单进程多线程:多个人在同一个桌子上一起吃菜. 3 多进程单线程:多个人每个人在自己的桌子上吃菜. 多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例 ...
- linux 系统硬件信息检测工具,Linux 查看系统硬件信息(实例详解)
cpu lscpu命令,查看的是cpu的统计信息.blue@blue-pc:~$ lscpu Architecture: i686 #cpu架构 CPU op- ...
- Linux查看和结束进程命令详解
转自:http://www.360doc.com/content/14/1021/20/14508903_418760439.shtml 先看两个例子: 例子一:结束某个程序,如Firefox ...
最新文章
- Hbase shell详情
- 从Google Wave和XML看软件复杂性之争,互联网营销
- 六十七、完成Vue项目首页图标区域布局和逻辑实现
- linux关闭开发者模式的命今,CentOS防火墙用命令行方式关闭的方式
- linux为用户添加sudo权限
- 30%企业定位平台型,不会出现类似BAT巨头
- word中图片超出页边距_如何在Word中更改页边距
- 【视频】视频文件格式和视频编码
- java dns 解析域名解析_java网络学习 java dns 域名解析协议实现
- mysql-conn.php_PHP连接MySQL方式
- 若依最详细的配置(零基础,小白版)
- C语言循环逻辑之if语句
- 最高分计算机公式,您好,excel怎么用函数公式计算最高分人数!用excle算最高分...
- quora 查看自己关注了谁
- git之merge和rebase
- 安科瑞企业微电网能效管理平台在某食品加工厂35kV变电站应用分析
- 【算法学习笔记001】捷联惯导算法心得
- 用Html+js自己写了一个小游戏
- 原来window7系统转化为xp的时候,安装系统的时候,出现蓝屏错误(stop:0x0000007b)
- Red Hat Enterprise Linux 7.3
热门文章
- Hadoop自学笔记(七)Hadoop环境配置和优化
- eclipse下新建py文件的辅助信息设置
- 高考特长计算机2017,2017年北京理工大学计算机学院申请竞赛获奖与特长生推荐.PDF...
- mysql 进阶到高级_mysql的高级进阶(一)
- db2查询表结构语句_SQL语句大全,赶快收藏吧!
- 如何在windows上玩转redis的最新特性?
- Java Garbage Collection Basics--转载
- graylog2 架构--转载
- Spring 资源访问剖析和策略模式应用
- 小白看Word2Vec的正确打开姿势|全部理解和应用