python多线程编程_Python 多线程编程
Thread类
classThread:def __init__(self,group=None,target=None,name=None,args=(),kwargs=None,*,daemon=None)
group:None,为日后扩展 ThreadGroup 类实现而保留。
target:run() 方法调用的目标函数。
name:线程名。默认值为Thread-N。
args:传递给目标函数的位置参数元组。
kwargs:传递给目标函数的关键字参数字典。
daemon:守护线程。
Thread类的常用方法和属性
start():启动线程,在一个线程里最多只能被调用一次。
run():调用 target 传递的目标函数,并从 args 和 kwargs 分别获取的位置和关键字参数。
name:线程名。
getName():获取线程名。
setName():设置线程名。
ident:线程标识符,是个非零整数。如果线程尚未启动则为None。
daemon:是否是守护线程的布尔值,默认为False。
isDaemon():返回线程是否是守护线程。
setDaemon():设置线程为守护线程。
join([time]):阻塞调用该方法的线程,直到被调用该方法的线程结束或超时。
is_alive():返回线程是否存活。
threading模块常用方法和属性
active_count():返回当前存活的 Thread 对象的计数。
enumerate():以列表形式返回当前存活的 Thread 对象。
current_thread():返回当前对应调用者的控制线程的 Thread 对象。
main_thread():返回主 Thread 对象。
get_ident():返回当前线程的"线程标识符"。
创建线程
可调用对象传递给构造函数
重写子类的 run() 方法
1. 可调用对象传递给构造函数
importthreadingimporttimedeffunc(n):print("task", n)
time.sleep(2)for i in range(2):
t= threading.Thread(target=func, args=(i,)) #创建线程
t.start() #启动线程
2. 重写子类的 run() 方法
importthreadingimporttimeclassMyThread(threading.Thread):def __init__(self, n):
super().__init__()
self.n=ndefrun(self):print("task", self.n)
time.sleep(2)for i in range(2):
t=MyThread(i)
t.start()
全局解释器锁
全局解释器锁(Global Interpreter Lock,简称GIL),是计算机程序设计语言解释器用于同步线程的工具,使得在同一进程内任何时刻仅有一个线程在执行。即使在多核CPU平台上,同一时刻也只有一个获得GIL的线程在执行,其他线程处于阻塞状态。
CPython使用操作系统的原生线程,由操作系统负责调度。
每个解释器进程有唯一的主线程和用户定义的任意数量子线程。
每个解释器进程有且仅有一个GIL,当解释器启动时,主线程获取GIL。
线程执行前要先获取GIL,当遇到I/O操作时释放GIL。
线程锁
原始锁处于"锁定"或者"非锁定"状态,被创建时是非锁定状态。它有两个基本方法:acquire(),release()。
当状态是非锁定时,线程调用 acquire() 获取锁,并阻塞其他线程,直到锁被释放,将状态修改为锁定。
当状态是锁定时,任何线程都可以调用 release() 释放锁,将状态修改为非锁定。
importthreadingimporttime
lock=threading.Lock()deffunc(n):
lock.acquire()#获取锁
print("task", n)
lock.release()#释放锁
time.sleep(2)for i in range(2):
t= threading.Thread(target=func, args=(i,))
t.start()
信号量
信号量管理一个内部计数器,调用 acquire() 方法时计数器-1,调用 release() 方法时计数器+1。当计数器为0时将会阻塞,直到线程调用 release() 方法。
importthreadingimporttime
semaphore= threading.BoundedSemaphore(2)deffunc(n, se):
se.acquire()print("task", n)
time.sleep(2)
se.release()for i in range(2):
t= threading.Thread(target=func, args=(i,semaphore))
t.start()
事件
事件是线程之间的一种通信机制:一个线程发出事件信号,其他线程等待该信号。
事件对象管理一个内部标志Flag,初始为false。调用 set() 方法可将其设置为 true,调用 clear() 方法可将其设置为false,调用 wait() 方法将阻塞线程直到标志为 true。
importthreadingimporttime
event=threading.Event()deffunc():print(threading.current_thread().getName(), "ready")
time.sleep(3)
event.wait()print(threading.currentThread().getName(), "go")for i in range(2):
t= threading.Thread(target=func)
t.start()print("Ready?Go!")
event.set()
python多线程编程_Python 多线程编程相关推荐
- 理解python并发编程_Python并发编程很简单
上次已经和大家探讨了关于进程和线程的区别和联系相关的东东,今天呢,咱们再次回到 好啦,废话少说,咱们就开始吧! 首先说一下哦,_thread和threading哦,到这可能有朋友会问了,这两个有什么区 ...
- python 网络编程_Python网络编程(六)
回顾 在<Python进阶记录之网络编程(五)>中,我们介绍了如何利用TCP服务端和客户端实现一个简单的点对点聊天,区别基于TCP协议和UDP协议的不同之处.今天我们讲一下如何利用多进程和 ...
- python 多进程并发_python并发编程之多进程
一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...
- python udp通信_Python网络编程(三)
回顾 在<Python进阶记录之网络编程(二)>中,我们介绍了UDP端口号的基本概念和作用以及Python中UDP服务端的端口绑定和简单创建.今天我们利用UDP server和UDP cl ...
- python多线程库_python多线程库
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点:使 ...
- python socket编程_Python Socket编程实现网络编程
对于有经验的开发人员来说,掌握的编程语言应该是不少的.在这些编程语言中,网络编程的应用时必不可少的.其中Python也是这样的编程语言.我们今天将会在这里为大家详细介绍一下Python Socket编 ...
- python 鱼骨图_python面向对象编程,鱼骨图分析法
一.面向对象编程 面向过程编程,核心是编程二字,过程指的是解决问题的步骤,即先干什么.后干什么.再干什么.然后干什么-- 与工厂的工艺流程差不多,前后都有影响 优点:复杂的问题流程化,进而简单化, ...
- python线程唤醒_python 多线程
python 多线程 真正的多线程吗? 对于多核处理器,在同一时间确实可以多个线程独立运行,但在Python中确不是这样的了.原因在于,python虚拟机中引入了GIL这一概念.GIL(Global ...
- python2异步编程_python异步编程入门
这几天看代码,总是会接触到很多异步编程,之前只想着实现功能,从来没考虑过代码的运行快慢问题,故学习一番. 从0到1,了解python异步编程的演进 1.urllib与requests爬虫 reques ...
- python多线程挂了_python多线程输入的问题 python高效编程技巧13(如何在线程之间实现...
python3 创建线程时不用args传参,执行线程时为什如果创建线程时在target里就传入了参数,为什么在启动线程时,线程不是在Python多线程下,每个线程的执行方式: 有什么了不起,大不了继续 ...
最新文章
- 1102 Invert a Binary Tree 需再做
- SpringBoot注解大全 转
- 加速!上海要做人工智能产业“领头雁”
- Python程序设计题解【蓝桥杯官网题库】 DAY5-基础练习
- 持币过节也能让钱生钱
- Nginx防盗链、访问控制、Nginx解析PHP相关配置、Nginx代理
- 人民大学云计算编程的网上评估平台--解题报告 1004-1007
- 数据库表字段命名规则
- C语言求一棵二叉树所有根到叶的路径(附完整源码)
- 【linux】服务器运维必备之linux常用命令合集
- 【渝粤题库】陕西师范大学400011 思想政治教育学科教学论 作业(专升本)
- python 元组与列表的异同点 1125
- PHP函数call_user_func和call_user_func_array详解
- 【分享】5G+北斗RTK高精度人员定位解决方案
- 人工智能认知技术,在各行业的应用介绍
- D. Binary Spiders(dpTrie)
- 《今日简史》--重新认识自己:人类心智的奥秘
- Andersen Global与斯德哥尔摩律所合作,扩大瑞典业务版图
- 表单设计工具和报表工具
- flex面试题及答案
热门文章
- WPF中得到一个控件相对其他控件的坐标
- c语言循环字符,字符串 非暴力for循环法(内附C语言代码)
- 下载android版趣步最新版,趣步下载2021安卓最新版_手机app官方版免费安装下载_豌豆荚...
- php和js序列化,PHP中serialize和json序列化与反序列化的区别
- python canny检测_【数字图像分析】基于Python实现 Canny Edge Detection(Canny 边缘检测算法)...
- Error: Cannot find module 'webpack-cli'--解决方案
- 基于Docker搭建GitLab代码管理
- 串口开发,数据类型转换——字符串转 byte[],byte[]转二进制,二进制转十进制转byte[],byte[]转十进制,byte[]拼接,校验
- 开发服务器 VSS开发库 自动备份方案
- oracle如何并发重建索引,oracle数据库如何重建索引?