匿名用户

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多线程几种方法实现相关推荐

  1. python去重复元素_Python实现去除列表中重复元素的方法总结【7种方法】

    这里首先给出来我很早之前写的一篇博客,Python实现去除列表中重复元素的方法小结[4种方法],感兴趣的话可以去看看,今天是在实践过程中又积累了一些方法,这里一并总结放在这里. 由于内容很简单,就不再 ...

  2. python通过什么对象连接数据库步骤_Python连接MySQL数据库方法介绍(超详细!手把手项目案例操作)...

    本文涉及到的开发环境:操作系统 Windows 10 数据库 MySQL 8.0 Python 3.7.2 pip 19.0.3 两种方法进行数据库的连接分别是PyMySQL和mysql.connec ...

  3. 用python修改文件内容修改txt内容的3种方法

    用python修改文件内容修改txt内容的3种方法 方法一.修改原文件方式 def updateFile(file,old_str,new_str):"""替换文件中的字 ...

  4. Python实现从url中提取域名的几种方法

    这篇文章主要介绍了Python实现从url中提取域名的几种方法,本文给出了3种方法实现在URL中提取域名的需求,需要的朋友可以参考下. 从url中找到域名,首先想到的是用正则,然后寻找相应的类库.用正 ...

  5. Python计算程序运行时间秒级/毫秒级的两种方法datetime和time

    Python计算程序运行时间秒级/毫秒级的两种方法datetime和time 简单粗暴,先上代码: import datetime import time# 方法一:datetime.datetime ...

  6. python list去重时间复杂度_List集合去重的一种方法 z

    需要对一个List集合去重,情况是该集合中会出现多个Name属性值相同的,但是其他属性值不同的数据. 在这种情况下,需求要只保留其中一个就好. 我觉得遍历和HashSet都不是我想要的,便采用了一下方 ...

  7. php 打印对象到文件,php实现将数组或对象写入到文件的方法小结【三种方法】...

    本文实例讲述了php实现将数组或对象写入到文件的方法.分享给大家供大家参考,具体如下: php将数组或对象原样写入或保存到文件有三种方法可以实现 第一种方法是使用serialize, 第二种方法是使用 ...

  8. php随机数字符串,php生成随机数/生成随机字符串的方法小结【5种方法】

    php生成随机数/生成随机字符串的方法小结[5种方法],字符串,随机数,在线,数组,字符 php生成随机数/生成随机字符串的方法小结[5种方法] 易采站长站,站长之家为您整理了php生成随机数/生成随 ...

  9. python多线程的作用_Python多线程中三个函数的强大功能简介

    在Python多线程中有三个比较简单的函数,在实际的相关操作中你对这一实际操作是否了解?是否对其感兴趣?如果你想对Python多线程的开发与多线程程序及相关实际操作方案有所了解的话,你就可以点击以下的 ...

最新文章

  1. MYSQL中删除重复记录
  2. 拯救“没常识”的GPT-3得靠它了,交大ACM班校友提出“Voken” 无监督学习 | EMNLP 2020...
  3. java add offer_图解Java中的5大队列!(干货收藏)
  4. heima-Oracle学习-day1
  5. 最新Angular2案例rebirth开源
  6. c语言 求方程ax,关于求方程ax2+bx+c=0根的问题
  7. CMake基础 第8节 包含第三方库
  8. 如何限制用户的内存使用量
  9. spring手动回滚事务_Spring总结---gt;03
  10. 计算机专业和机电专业的区别,12届计算机专业和机电专业.doc
  11. 白鹭引擎和layabox哪个好用,哪个技术更成熟 ?
  12. 一次性补助20万,博士买房比市价低1.5万/平!26城硕博引进政策哪家强?
  13. 学校计算机比赛策划,学校计算机技能比赛活动策划方案
  14. 计算机系的的毕业感言,计算机班同学的毕业感言
  15. 学习-Java循环while之求非负数之和
  16. nlp gpt论文_gpt 3变形金刚和nlp的狂野世界
  17. HCNP——LSR报文、LSU报文及LSAck报文
  18. C++上机实验六第2题
  19. DCDC电源SW波形负压以及轻载振荡问题
  20. 华为新系统鸿蒙何时亮相,终于!华为鸿蒙系统正式发布,P50亮相

热门文章

  1. Android通过Chrome Inspect调试WebView
  2. 用C语言编程 限定输入的年月日,C语言程序设计: 输入年月日 然后输出是星期几...
  3. oracle 257,ORACLE 10g SYSAUX表空间快速增长之WRH$_ACTIVE_SESSION_HISTORY篇
  4. flask uwsgi nginx 部署在 ubuntu 上
  5. python 中文字转拼音
  6. java普通项目打包成exe可执行文件
  7. 【建站系列教程】7、SEO优化之meta标签【最后一篇】
  8. Windows系统下多版本GCC的安装: MinGW Cygwin Msys2 和 VS: MSVC
  9. ip转数字 java_Java IP地址转换和数字相互转换算法
  10. java 多线程bean 注入_java多线程中注入Spring对象问题