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 多线程编程相关推荐

  1. 理解python并发编程_Python并发编程很简单

    上次已经和大家探讨了关于进程和线程的区别和联系相关的东东,今天呢,咱们再次回到 好啦,废话少说,咱们就开始吧! 首先说一下哦,_thread和threading哦,到这可能有朋友会问了,这两个有什么区 ...

  2. python 网络编程_Python网络编程(六)

    回顾 在<Python进阶记录之网络编程(五)>中,我们介绍了如何利用TCP服务端和客户端实现一个简单的点对点聊天,区别基于TCP协议和UDP协议的不同之处.今天我们讲一下如何利用多进程和 ...

  3. python 多进程并发_python并发编程之多进程

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

  4. python udp通信_Python网络编程(三)

    回顾 在<Python进阶记录之网络编程(二)>中,我们介绍了UDP端口号的基本概念和作用以及Python中UDP服务端的端口绑定和简单创建.今天我们利用UDP server和UDP cl ...

  5. python多线程库_python多线程库

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点:使 ...

  6. python socket编程_Python Socket编程实现网络编程

    对于有经验的开发人员来说,掌握的编程语言应该是不少的.在这些编程语言中,网络编程的应用时必不可少的.其中Python也是这样的编程语言.我们今天将会在这里为大家详细介绍一下Python Socket编 ...

  7. python 鱼骨图_python面向对象编程,鱼骨图分析法

    一.面向对象编程 ​ 面向过程编程,核心是编程二字,过程指的是解决问题的步骤,即先干什么.后干什么.再干什么.然后干什么-- 与工厂的工艺流程差不多,前后都有影响 优点:复杂的问题流程化,进而简单化, ...

  8. python线程唤醒_python 多线程

    python 多线程 真正的多线程吗? 对于多核处理器,在同一时间确实可以多个线程独立运行,但在Python中确不是这样的了.原因在于,python虚拟机中引入了GIL这一概念.GIL(Global ...

  9. python2异步编程_python异步编程入门

    这几天看代码,总是会接触到很多异步编程,之前只想着实现功能,从来没考虑过代码的运行快慢问题,故学习一番. 从0到1,了解python异步编程的演进 1.urllib与requests爬虫 reques ...

  10. python多线程挂了_python多线程输入的问题 python高效编程技巧13(如何在线程之间实现...

    python3 创建线程时不用args传参,执行线程时为什如果创建线程时在target里就传入了参数,为什么在启动线程时,线程不是在Python多线程下,每个线程的执行方式: 有什么了不起,大不了继续 ...

最新文章

  1. 1102 Invert a Binary Tree 需再做
  2. SpringBoot注解大全 转
  3. 加速!上海要做人工智能产业“领头雁”
  4. Python程序设计题解【蓝桥杯官网题库】 DAY5-基础练习
  5. 持币过节也能让钱生钱
  6. Nginx防盗链、访问控制、Nginx解析PHP相关配置、Nginx代理
  7. 人民大学云计算编程的网上评估平台--解题报告 1004-1007
  8. 数据库表字段命名规则
  9. C语言求一棵二叉树所有根到叶的路径(附完整源码)
  10. 【linux】服务器运维必备之linux常用命令合集
  11. 【渝粤题库】陕西师范大学400011 思想政治教育学科教学论 作业(专升本)
  12. python 元组与列表的异同点 1125
  13. PHP函数call_user_func和call_user_func_array详解
  14. 【分享】5G+北斗RTK高精度人员定位解决方案
  15. 人工智能认知技术,在各行业的应用介绍
  16. D. Binary Spiders(dpTrie)
  17. 《今日简史》--重新认识自己:人类心智的奥秘
  18. Andersen Global与斯德哥尔摩律所合作,扩大瑞典业务版图
  19. 表单设计工具和报表工具
  20. flex面试题及答案

热门文章

  1. WPF中得到一个控件相对其他控件的坐标
  2. c语言循环字符,字符串 非暴力for循环法(内附C语言代码)
  3. 下载android版趣步最新版,趣步下载2021安卓最新版_手机app官方版免费安装下载_豌豆荚...
  4. php和js序列化,PHP中serialize和json序列化与反序列化的区别
  5. python canny检测_【数字图像分析】基于Python实现 Canny Edge Detection(Canny 边缘检测算法)...
  6. Error: Cannot find module 'webpack-cli'--解决方案
  7. 基于Docker搭建GitLab代码管理
  8. 串口开发,数据类型转换——字符串转 byte[],byte[]转二进制,二进制转十进制转byte[],byte[]转十进制,byte[]拼接,校验
  9. 开发服务器 VSS开发库 自动备份方案
  10. oracle如何并发重建索引,oracle数据库如何重建索引?