python多线程

Python实战笔记(三) 多线程

陌路散爱 提交于 2020-02-08 00:06:10
Python 提供 threading 模块用于控制线程,使我们处理多线程更加方便 1、线程模块的常用属性和方法 active_count() :返回当前存活的线程对象的数量 enumerate() :返回当前存活的线程对象的列表 current_thread() :返回当前线程对象 main_thread() :返回主线程对象 get_ident() :返回当前线程的线程标识符 stack_size([size]) :返回创建线程时使用的堆栈大小 TIMEOUT_MAX :指定阻塞函数(如 acquire 、 wait 、 wait_for 等)timeout 参数的最大值 import threading thread_number = threading.active_count() print(thread_number) # 1 curr_thread = threading.main_thread() main_thread = threading.current_thread() print(curr_thread == main_thread) # True 2、创建线程对象 threading.Thread(group, target, name, args, kwargs, *, daemon) group:为拓展 ThreadGroup 而保留,无需设置

网络编程并发编程面试题

泄露秘密 提交于 2020-02-07 23:47:48
网络编程,并发编程 面试题1. 简述 OSI 七层协议。应用层与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。示例:TELNET,HTTP,FTP,NFS,SMTP等。表示层这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASCII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据。在接收方将标准的ASCII转换成接收方计算机的字符集。示例:加密,ASCII等。会话层它定义了如何开始、控制和结束一个会话,包括对多个双向消息的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。传输层这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。网络层这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址

python3 多线程简介

一世执手 提交于 2020-02-07 20:46:45
进程与线程 进程:进程是资源(CPU、内存等)分配的最小单位,进程有独立的地址空间与系统资源,一个进程可以包含一个或多个线程 线程:线程是CPU调度的最小单位,是进程的一个执行流,线程依赖于进程而存在,线程共享所在进程的地址空间和系统资源,每个线程有自己的堆栈和局部变量 形象的解释: 系统是一个工厂,进程就是工厂里面的车间; 车间的空间大小以及里面的生产工具就是系统分配给进程的资源(CPU、内存等); 车间要完成生产,就需要工人,工人就是线程; 工人可以使用车间的所有资源,就是线程共享进程资源; 工人使用车间内的一个工作间(全局变量,共享内存)工作的时候,为了防止其他工人打扰,会上一把锁,工作完成才会取下,这是线程锁; 有的工作间可以同时容纳多个工人工作,于是就有多把钥匙,每个工人就拿上一把,所有钥匙被取完后,其他工人就只能等着,这是信号量(Semaphore); 有时候工人之间有合作,当一个工作间的工人工作到满足某个条件时,会发出通知并同时退出工作间,将钥匙交给另外符合条件正在等待的工人完成工作,这叫条件同步; 还有一种工作模式,当一个工人完成到某个指标时,会将工作传递给其它等待这个指标触发的工人工作,这叫事件同步 并发与并行 并发:当系统只有一个CPU时,想执行多个线程,CPU就会轮流切换多个线程执行,当有一个线程被执行时,其他线程就会等待,但由于CPU调度很快

Python多线程与多进程

 ̄綄美尐妖づ 提交于 2020-02-07 03:00:31
Python多进程 1.用os.fock函数 2.使用multiprocessing模块 方法1只能在linux系统中使用 方法2提供了跨平台的多线程模块 #coding:utf-8 from multiprocessing import Process from time import sleep def func ( num ) : print '进程%d开始' % ( num ) sleep ( num ) print '进程结束' num = 5 for i in range ( 1 , num + 1 ) : p = Process ( target = func , args = ( i , ) ) p . start ( ) #p.join()#添加这句会等待子线程结束之后主线程再结束 还有通过继承的方式实现多进程 #coding:utf-8 from multiprocessing import Process from time import sleep def func ( num ) : print '线程%d开始' % ( num ) sleep ( num ) print '线程%d结束' % ( num ) class MyProcess ( Process ) : def __init__ ( self , num ) : super (

python学习笔记第十五天------------网络编程之线程

◇◆丶佛笑我妖孽 提交于 2020-02-06 00:56:40
文章目录 1.多任务 1.1 现实生活中 1.2 程序中 1.3 多任务的概念 2. 线程 2.1 使用threading模块 2.2.1 单线程执行 2.2.2 多线程执行 2.2 主线程会等待所有的子线程结束后才结束 2.3 查看线程数量 2.4 线程-注意点 2.4.1 线程执行代码的封装 2.4.2 线程的执行顺序 2.4.3 总结 2.5 多线程 2.5.1 多线程-共享全局变量 2.5.2 列表当做实参传递到线程中 2.5.3 多线程-共享全局变量问题 3. 同步 4. 互斥锁 4.1 互斥锁的概念 4.2 互斥锁的演练 4.3 上锁解锁过程 4.4 总结 5. 死锁 1.多任务 1.1 现实生活中 有很多的场景中的事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的;如果把唱歌和跳舞这2件事情分开依次完成的话,估计就没有那么好的效果了(想一下场景:先唱歌,然后在跳舞。。。。。。。。。。。。。。。。 1.2 程序中 #coding=utf-8 from time import sleep def sing ( ) : for i in range ( 3 ) : print ( "正在唱歌...%d" % i ) sleep ( 1 ) def dance ( ) : for i in range ( 3 ) : print (

线程

北城以北 提交于 2020-02-05 19:34:50
1.线程介绍 1.什么是线程 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。 2. 有了进程为什么要有线程   进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上: 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。 3.进程和线程的关系 线程与进程的区别可以归纳为以下4点 地址空间和其他资源:进程间相互独立,统一进程的歌线程间共享,某进程内的线程在其他进程不可见。 通信:进程间通信IPC,线程间可以直接读写进程进程数据段(如全局变量)来进行通信,需要进程同步和互斥手段的辅助,以保住数据的一致性。 调度和切换:线程上下文切换比进程上下文切换要快的多。 在多线程操作系统中,进程不是一个可执行的实体。  4.线程的特点

进程池,线程池使用

大兔子大兔子 提交于 2020-02-04 11:13:32
进程的概念 第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。[3] 进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。 引入进程原因 为了提高资源利用率和系统处理能力,现阶段计算机系统都是多道程序系统,即多道程序并发执行。 优化系统资源,方便计算机调度,避免系统运算紊乱。 进程的并行与并发 并行 :并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑;(资源够用,比如三个线程,四核CPU) 并发 :并行是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A,交替使用,目的是提高效率。 并行简图 并发(线程) 二、进程线程 1、进程 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程

GIL全局解释器锁

拜拜、爱过 提交于 2020-02-03 22:28:10
GIL全局解释器锁 一、GIL全局解释器锁 Python代码的执行由Python虚拟机(也叫解释器主循环)来控制。 Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行。 虽然 Python 解释器中可以“运行”多个线程, 但在任意时刻只有一个线程在解释器中运行。 对Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。 在多线程环境中,Python 虚拟机按以下方式执行: 设置 GIL; 切换到一个线程去运行; 运行指定数量的字节码指令或者线程主动让出控制(可以调用 time.sleep(0)); 把线程设置为睡眠状态; 解锁 GIL; 再次重复以上所有步骤。 在调用外部代码(如 C/C++扩展函数)的时候,GIL将会被锁定, 直到这个函数结束为止 (由于在这期间没有Python的字节码被运行,所以不会做线程切换)编写扩展的程序员可以主动解锁GIL。 来源: https://www.cnblogs.com/randysun/p/12257670.html

Python数据库连接池 -组件 DBUtils

亡梦爱人 提交于 2020-02-03 08:40:02
DBUtils是Python的一个用于实现数据库连接池的模块 此连接池有两种连接模式: DBUtils提供两种外部接口: PersistentDB :提供线程专用的数据库连接,并自动管理连接。 PooledDB :提供线程间可共享的数据库连接,并自动管理连接。 PersistentDB 模式 为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把链接重新放到链接池,供自己线程再次使用,当线程终止时,链接自动关闭 from DBUtils.PersistentDB import PersistentDB import pymysql POOL = PersistentDB( creator=pymysql, # 使用链接数据库的模块 maxusage=None, # 一个链接最多被重复使用的次数,None表示无限制 setsession=[], # 开始会话前执行的命令列表。 ping=0, # ping MySQL服务端,检查是否服务可用。 closeable=False, # 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection(

threading 使用笔记

隐身守侯 提交于 2020-02-02 01:15:38
threading模块介绍以及常用方法 介绍 threading模块是Python支持多线程编程的重要模块,该模块是在底层模块_thread的基础上开发的更高层次的线程编程接口,提供了大量的方法和类来支持多线程编程。 threading模块常用方法表 方法 功能说明 threading.active_count() 获取当前处于alive状态的Thread对象数量 threading.current_thread() 获取当前的Thread对象 threading.get_ident() 获取当前线程的线程标识符 threading.enumerate() 获取当前处于alive状态的所有Thread对象列表 threading.main_thread() 获取主线程对象,即启动Python解析器的线程对象 threading.stack_size([size]) 获取创建线程时所使用的栈的大小,如果指定size参数,则用来指定后续创建线程使用的栈大小,size必须是0或大于32K的正整数 简单例子 # 例 1-1 import threading ''' 0 ''' print ( threading . stack_size ( ) ) ''' Traceback (most recent call last): ** IDLE Internal Exception: File