python真正实现多线程的方法_python多线程几种方法实现
匿名用户
1级
2018-05-27 回答
Python进阶(二十六)-多线程实现同步的四种方式
临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区。
锁机制
threading的Lock类,用该类的acquire函数进行加锁,用realease函数进行解锁
import threadingimport timeclass Num:
def __init__(self):
self.num = 0
self.lock = threading.Lock() def add(self):
self.lock.acquire()#加锁,锁住相应的资源
self.num += 1
num = self.num
self.lock.release()#解锁,离开该资源
return num
n = Num()class jdThread(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = item def run(self):
time.sleep(2)
value = n.add()#将num加1,并输出原来的数据和+1之后的数据
print(self.item,value)for item in range(5):
t = jdThread(item)
t.start()
t.join()#使线程一个一个执行12345678910111213141516171819202122232425262728
当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“同步阻塞”(参见多线程的基本概念)。
直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态。线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态。
信号量
信号量也提供acquire方法和release方法,每当调用acquire方法的时候,如果内部计数器大于0,则将其减1,如果内部计数器等于0,则会阻塞该线程,知道有线程调用了release方法将内部计数器更新到大于1位置。
import threadingimport timeclass Num:
def __init__(self):
self.num = 0
self.sem = threading.Semaphore(value = 3) #允许最多三个线程同时访问资源
def add(self):
self.sem.acquire()#内部计数器减1
self.num += 1
num = self.num
self.sem.release()#内部计数器加1
return num
n = Num()class jdThread(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = item def run(self):
time.sleep(2)
value = n.add()
print(self.item,value)for item in range(100):
python真正实现多线程的方法_python多线程几种方法实现相关推荐
- python去重复元素_Python实现去除列表中重复元素的方法总结【7种方法】
这里首先给出来我很早之前写的一篇博客,Python实现去除列表中重复元素的方法小结[4种方法],感兴趣的话可以去看看,今天是在实践过程中又积累了一些方法,这里一并总结放在这里. 由于内容很简单,就不再 ...
- python通过什么对象连接数据库步骤_Python连接MySQL数据库方法介绍(超详细!手把手项目案例操作)...
本文涉及到的开发环境:操作系统 Windows 10 数据库 MySQL 8.0 Python 3.7.2 pip 19.0.3 两种方法进行数据库的连接分别是PyMySQL和mysql.connec ...
- 用python修改文件内容修改txt内容的3种方法
用python修改文件内容修改txt内容的3种方法 方法一.修改原文件方式 def updateFile(file,old_str,new_str):"""替换文件中的字 ...
- Python实现从url中提取域名的几种方法
这篇文章主要介绍了Python实现从url中提取域名的几种方法,本文给出了3种方法实现在URL中提取域名的需求,需要的朋友可以参考下. 从url中找到域名,首先想到的是用正则,然后寻找相应的类库.用正 ...
- Python计算程序运行时间秒级/毫秒级的两种方法datetime和time
Python计算程序运行时间秒级/毫秒级的两种方法datetime和time 简单粗暴,先上代码: import datetime import time# 方法一:datetime.datetime ...
- python list去重时间复杂度_List集合去重的一种方法 z
需要对一个List集合去重,情况是该集合中会出现多个Name属性值相同的,但是其他属性值不同的数据. 在这种情况下,需求要只保留其中一个就好. 我觉得遍历和HashSet都不是我想要的,便采用了一下方 ...
- php 打印对象到文件,php实现将数组或对象写入到文件的方法小结【三种方法】...
本文实例讲述了php实现将数组或对象写入到文件的方法.分享给大家供大家参考,具体如下: php将数组或对象原样写入或保存到文件有三种方法可以实现 第一种方法是使用serialize, 第二种方法是使用 ...
- php随机数字符串,php生成随机数/生成随机字符串的方法小结【5种方法】
php生成随机数/生成随机字符串的方法小结[5种方法],字符串,随机数,在线,数组,字符 php生成随机数/生成随机字符串的方法小结[5种方法] 易采站长站,站长之家为您整理了php生成随机数/生成随 ...
- python多线程的作用_Python多线程中三个函数的强大功能简介
在Python多线程中有三个比较简单的函数,在实际的相关操作中你对这一实际操作是否了解?是否对其感兴趣?如果你想对Python多线程的开发与多线程程序及相关实际操作方案有所了解的话,你就可以点击以下的 ...
最新文章
- MYSQL中删除重复记录
- 拯救“没常识”的GPT-3得靠它了,交大ACM班校友提出“Voken” 无监督学习 | EMNLP 2020...
- java add offer_图解Java中的5大队列!(干货收藏)
- heima-Oracle学习-day1
- 最新Angular2案例rebirth开源
- c语言 求方程ax,关于求方程ax2+bx+c=0根的问题
- CMake基础 第8节 包含第三方库
- 如何限制用户的内存使用量
- spring手动回滚事务_Spring总结---gt;03
- 计算机专业和机电专业的区别,12届计算机专业和机电专业.doc
- 白鹭引擎和layabox哪个好用,哪个技术更成熟 ?
- 一次性补助20万,博士买房比市价低1.5万/平!26城硕博引进政策哪家强?
- 学校计算机比赛策划,学校计算机技能比赛活动策划方案
- 计算机系的的毕业感言,计算机班同学的毕业感言
- 学习-Java循环while之求非负数之和
- nlp gpt论文_gpt 3变形金刚和nlp的狂野世界
- HCNP——LSR报文、LSU报文及LSAck报文
- C++上机实验六第2题
- DCDC电源SW波形负压以及轻载振荡问题
- 华为新系统鸿蒙何时亮相,终于!华为鸿蒙系统正式发布,P50亮相
热门文章
- Android通过Chrome Inspect调试WebView
- 用C语言编程 限定输入的年月日,C语言程序设计: 输入年月日 然后输出是星期几...
- oracle 257,ORACLE 10g SYSAUX表空间快速增长之WRH$_ACTIVE_SESSION_HISTORY篇
- flask uwsgi nginx 部署在 ubuntu 上
- python 中文字转拼音
- java普通项目打包成exe可执行文件
- 【建站系列教程】7、SEO优化之meta标签【最后一篇】
- Windows系统下多版本GCC的安装: MinGW Cygwin Msys2 和 VS: MSVC
- ip转数字 java_Java IP地址转换和数字相互转换算法
- java 多线程bean 注入_java多线程中注入Spring对象问题