python多线程

Python:多线程&事件

扶醉桌前 提交于 2020-02-01 18:15:00
信号灯模拟 from multiprocessing import Process , Event import time # 事件通过is_set()的bool值表示e.wait()的阻塞状态 # True为非阻塞状态,False为阻塞状态 # 使用set(),把is_set()变成True,变为非阻塞状态 # 使用clear(),把is_set()变成False,变为阻塞状态 def tra ( e ) : print ( '绿灯亮' ) e . set ( ) while 1 : # 非阻塞状态,代表绿灯亮 if e . is_set ( ) : time . sleep ( 2 ) print ( '红灯亮' ) e . clear ( ) # 阻塞状态,代表红灯亮 else : time . sleep ( 2 ) print ( '绿灯亮' ) e . set ( ) def Car ( i , e ) : e . wait ( ) print ( '第%s辆车过去了' % i ) if __name__ == '__main__' : e = Event ( ) traffic_light = Process ( target = tra , args = ( e , ) ) traffic_light . start ( ) for i in range ( 50

python学习笔记——正则表达式和多线程

纵饮孤独 提交于 2020-01-31 18:47:06
正则表达式 30分钟正则表达式 python中对于正则表达式使用re模块处理 因为python本身也用 \ 转义,所以可以在字符串前使用 r 前缀,这样就不用考虑转义问题了。 match() match()方法判断是否匹配成功,然会一个match()对象,否则返回None。 import re test = '字符串' if re.match(r'正则表达式',test): print('ok') else: print('failed') split() re模块中的split([正则表达式],[字符串])方法可以使用正则表达式分割字符串,返回值为分割后的字符串字典。 ()括号分组 使用 () 可以提取分组, ^(\d{3})-(\d{3,8})$ 前后为两个组,可以直接从匹配后的字符串中提取出两部分内容。 如果正则表达式中定义了组,那么就可以在match()对象中使用group()方法提取字符串。 group(0)为源字符串,group(1)为第一个子串,group(2)为第二个子串。 compile() 如果一个正则表达式需要重复使用,那么应该预编译该正则表达式。 re.compile([正则表达式]) 方法用于预编译正则表达式。 多线程 任何进程默认都会启动一个线程,这个线程被称为主线程,主线程又可以启动新的线程。 threading模块中的 current_thread(

python多线程与多进程

六月ゝ 毕业季﹏ 提交于 2020-01-31 00:58:40
线程与进程 1.1 简介 说到线程就不得不提与之相关的另一概念:进程,那么什么是进程?与线程有什么关系呢?简单来说一个运行着的应用程序就是一个进程,比如:我启动了自己手机上的网易云音乐播放器,这就是一个进程,然后我随意点了一首歌曲进行播放,此时酷猫启动了一条线程进行音乐播放,听了一部分,我感觉歌曲还不错,于是我按下了下载按钮,此时网易云音乐又启动了一条线程进行音乐下载,现在网易云同时进行着音乐播放和音乐下载,此时就出现了多线程,音乐播放线程与音乐下载线程并行运行,说到并行,你一定想到了并发吧,那并行与并发有什么区别呢?并行强调的是同一时刻,并发强调的是一段时间内。 线程是进程的一个执行单元,一个进程中至少有一条线程,进程是资源分配的最小单位,线程是 CPU 调度的最小单位。 线程一般会经历新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、死亡(Dead)5 种状态,当线程被创建并启动后,并不会直接进入运行状态,也不会一直处于运行状态,CPU 可能会在多个线程之间切换,线程的状态也会在就绪和运行之间转换。 1.2 python多线程与多进程模块 Python 提供了 _thread(Python3 之前名为 thread ) 和 threading 两个线程模块。_thread 是低级、原始的模块,threading 是高级模块,对

田小花语音机器人(三)使用python的threading类建立基础多线程程序

和自甴很熟 提交于 2020-01-30 13:33:06
本来是想用thread来着,结果在开始导入thread模块的时候就掉坑了 好气哦,ubuntu 环境下打开pycharm搜索这个模块竟然找不到!!! 于是我换源,参考这篇博客: https://blog.csdn.net/IAMoldpan/article/details/78544598 结果还是不行T_T 我输了,去找答案,于是乎网上说python3里面已经把thread取代了… Python 为啥不建议使用 thread模块? 于是换成threading threading有比thread更好的线程管理和解决方法 搜索pythreading,直接成功,废了我一个小时时间 ×_× 55555 教程参考大神的文章: Python多线程编程(一):threading 模块 Thread 类的用法详解 python:threading.Thread类的使用详解 下面是我学习的代码,实现了如下功能: 1、建立了两个子线程 2、主线程和子线程分别按照时间顺序打印数字i,得到三组不同输出 3、使用time类获得延时操作 4、使用相关线程方法使得主线程和线程2必须在线程1执行结束以后才执行 代码如下: #!/usr/bin/python #encoding:utf-8 # import time import threading def function(): for i in range

Python多线程编程

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-30 05:11:45
多线程编程 多线程编程可以将任务划分成多个执行流,每个执行流都有一个指定要完成的任务,这些子任务可能需要计算出中间结果,然后合并为最终的输出结果。 进程 有时称为重量级进程 线程 有时候称为轻量级进程,可以将它们认为是在一个主进程或“主线程”中 并行运行 的一些“迷你进程”。一个进程中的各个线程与主线程 共享同一片数据空间 。每个新进程都拥有自己的内存和数据栈等,只能采用进程间通信( IPC )的方式共享信息。 全局解释器锁 要想在python中使用多线程编程,必须要知道全局解释器锁的概念。 内存中可以有许多程序,但是在任意给定时刻只能有一个程序在运行。同理,尽管python解释器中可以运行多个线程,但是在 任意给定时刻只有一个线程会被解释器执行 。 这个是由全局解释器锁(GIL)控制的,保证只能有一个线程在运行,它在多线程环境中的执行方式如下。 设置GIL 切换进一个线程去运行 执行操作 把线程设置回睡眠状态(切换出线程) 解锁GIL 重复上述步骤 python多线程模块 包括thread、threading、queue模块等。 thread模块提供了基本的线程和锁定支持; threading模块提供了更高级别、功能更全面的线程管理; queue模块创建一个队列数据结构,用于在多线程之间进行共享。 提示: 避免使用thread模块 python由于GIL的限制,多线程更适合于I

Java基础面试知识点总结

纵然是瞬间 提交于 2020-01-30 02:28:02
本文主要是我最近复习Java基础原理过程中写的Java基础学习总结。Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实可能只是停留在表面上,没有理解其底层实现原理。 纸上得来终觉浅,绝知此事要躬行。笔者之前对每部分的内容 对做了比较深入的学习以及代码实现,基本上比较全面地讲述了每一个Java基础知识点,当然可能有些遗漏和错误,还请读者指正。 更多关于Java后端学习的内容请到我的CSDN博客上查看: https://blog.csdn.net/a724888 Java基础学习总结 每部分内容会重点写一些常见知识点,方便复习和记忆,但是并不是全部内容,详细的内容请参见具体的文章地址。 面向对象三大特性 继承:一般类只能单继承,内部类实现多继承,接口可以多继承 封装:访问权限控制public > protected > 包 > private 内部类也是一种封装 多态:编译时多态,体现在向上转型和向下转型,通过引用类型判断调用哪个方法(静态分派)。 运行时多态,体现在同名函数通过不同参数实现多种方法(动态分派)。 基本数据类型 基本类型位数,自动装箱,常量池 例如byte类型是1byte也就是8位,可以表示的数字是-128到127,因为还有一个0,加起来一共是256,也就是2的八次方。 32位和64位机器的int是4个字节也就是32位

python网络编程--进程线程

别等时光非礼了梦想. 提交于 2020-01-29 19:08:21
一:什么是进程   一个程序执行时的实例被称为一个进程。   每个进程都提供执行程序所需的资源。 一个进程有一个虚拟地址空间、可执行代码、对系统对象的开放句柄、一个安全上下文、一个独特的进程标识符、环境变量、一个优先级类、最小和最大工作集大小,以及至少一个执行线程。 每个进程以一个线程开始,通常称为主线程,但可以从它的任何线程创建额外的线程。   程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。 二:有了进程为什么还要线程? 进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上: 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。 一个操作系统就像是一个工厂,工厂里面有很多个生产车间,不同的车间生产不同的产品,每个车间就相当于一个进程,且你的工厂又穷,供电不足,同一时间只能给一个车间供电,为了能让所有车间都能同时生产

Flask之数据库连接池——DBUtils模块

强颜欢笑 提交于 2020-01-29 06:12:20
DBUtils DBUtils是Python的一个用于实现数据库连接池的模块。 此连接池有两种连接模式: 一、独立线程 模式一:为每个线程创建一个连接。线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程再次使用。当线程终止时,才会将连接自动关闭。 但这种方法:一方面可能线程数特别多。不可控,需要控制线程 ;另一方面,每个线程要运行结束才能自动关闭,占有资源。 POOL = PersistentDB ( creator = pymysql , # 使用链接数据库的模块 maxusage = None , # 一个链接最多被重复使用的次数,None表示无限制 setsession = [ ] , # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."] ping = 0 , # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always (一般情况下,使用4就可以) closeable = False , # <一般不会改>,如果为False时

Python多线程

瘦欲@ 提交于 2020-01-29 04:03:12
threading 模块 threading.currentThread(): 返回当前的线程变量。 threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。 Thread类提供了以下方法: run(): 用以表示线程活动的方法。 start():启动线程活动。 join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。 isAlive(): 返回线程是否活动的。 getName(): 返回线程名。 setName(): 设置线程名。 Thread构造器 在线程里,传递参数有三种方法: 使用元组传递 threading.Thread(target=方法名,args=(参数1,参数2, ...)) 使用字典传递 threading.Thread(target=方法名, kwargs={"参数名": 参数1, "参数名": 参数2, ...}) 混合使用元组和字典 threading.Thread(target=方法名,args=(参数1, 参数2, ...),

python多线程

做~自己de王妃 提交于 2020-01-29 00:38:55
线程同步、锁 如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。 考虑这样一种情况:一个列表里所有元素都是0,线程"set"从后向前把所有元素改成1,而线程"print"负责从前往后读取列表并打印。那么,可能线程"set"开始改的时候,线程"print"便来打印列表了,输出就成了一半0一半1,这就是数据的不同步。为了避免这种情况,引入了锁的概念。 锁有两种状态——锁定和未锁定。每当一个线程比如"set"要访问共享数据时,必须先获得锁定;如果已经有别的线程比如"print"获得锁定了,那么就让线程"set"暂停,也就是同步阻塞;等到线程"print"访问完毕,释放锁以后,再让线程"set"继续。经过这样的处理,打印列表时要么全部输出0,要么全部输出1,不会再出现一半0一半1的尴尬场面。 import threading import time class myThread(threading.Thread): def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self): print