python多线程

并发编程

余生颓废 提交于 2019-12-23 05:46:20
并发编程是网络编程中必须考虑的问题,实现并发的方式有多种:多进程,多线程,IO多路复用. python中调用的是操作系统的线程和进程. 进程:   进程表示资源分配的基本单位,是调度运行的基本单位.例如,用户运行一个程序时,系统就创建一个进程,为它分配资源,然后放入进程就绪队列.进程调度程序选中它,为它分配CPU,进程就开始运行.进程是系统中的并发执行单位.进程之间有数据隔离,进程是为了提供线程工作的环境. 线程:   线程是进程中执行运算的最小单位,也是执行CPU调度的基本单位.线程属于进程,线程运行在进程空间内,同一进程产生的线程共享同一内存空间,当进程退出的时候,该进程产生的所有线程都会被强制退出并清除.线程可与属于同一进程的其他线程共享进程拥有的全部资源,线程本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息. 进程和线程的关系:   1.一个线程只能属于一个进程,一个进程可以拥有多个线程,至少有一个线程.线程是操作系统可识别的最小执行和调度单位.   2.资源分配给进程,同一个进程的所有线程共享该进程的所有资源.同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储).每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有的局部变量和临时变量.   3.真正在CPU上运行的是线程.   4.线程在执行过程中,需要协作同步

Python 中的线程与进程(四)

爷,独闯天下 提交于 2019-12-23 03:16:15
由于大多数程序不需要有多线程的能力,所以在Python启动的时候并不支持多线程。也就是说,Python中支持多线程所需要的数据结构特别是GIL并没有创建。当Python虚拟机启动的时候,多线程处理并没有打开,而仅仅支持单线程。只有当程序中使用了如thread.start_new_thread等方法的时候,python才知道需要有多线程处理的支持,此时,python虚拟机才会自动创建多线程处理所需要的数据结构与GIL。 生成和终止线程(由于thread模块比较低级,不被推荐使用,所以就不说了) 1 使用threading.Thread类(构造函数:Thread(group = None, target = None, name = None, args = (), kwargs = {})   使用threading模块来创建线程是很简单的。简单地说,只要继承threading.Thread,然后在__init__方法中,调用threading.Thread类的__init__方法,重写类的run方法就可以了。 import threading class MyThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): pass thread =

Python:线程

Deadly 提交于 2019-12-23 00:50:41
Python中创建线程有两种方式:函数或者用类来创建线程对象。 函数式: 调用 _thread 模块中的start_new_thread()函数来产生新线程。 类: 创建 threading.Thread的子类来包装一个线程对象。 一.函数式:调用thread模块中的start_new_thread()函数来产生新线程 thread.start_new_thread ( function, args[, kwargs] ) function - 线程函数 args - 传递给线程函数的参数,他必须是个tuple类型 kwargs - 可选参数 例:通过thread来创建新线程 import thread,time def timer(name,delay): count = 0 while count < 5: time.sleep(delay) count +=1 print "%s:%s" %(name,time.ctime()) #创建两个线程 thread.start_new_thread(timer,('Thread-1',2,)) #timer表示执行timer函数,后面元组内表示timer函数的两个参数 thread.start_new_thread(timer,('Thread-2',4,)) while 1: pass 输出结果: Thread-1:Tue Oct

并发(进程、线程)

本小妞迷上赌 提交于 2019-12-23 00:22:42
必要的理论知识 #一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理、调度进程,并且将多个进程对硬件的竞争变得有序 #二 多道技术: 1.产生背景:针对单核,实现并发 ps: 现在的主机一般是多核,那么每个核都会利用多道技术 有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个 cpu中的任意一个,具体由操作系统调度算法决定。 2.空间上的复用:如内存中同时有多道程序 3.时间上的复用:复用一个cpu的时间片 切换:(遇到IO、占用CPU时间过长、更高优先级的应用程序)     保存状态:在即将切换到另一应用程序时,需要保存当前程序的状态       cpu在多个任务之间来回切换的好处与不足      1、一个任务占用cpu时间长,会被操作系统强行剥夺走cpu的执行权限:只是为了保证并发的效果,反而会降低效率      2、一个任务遇到io操作,会被操作系统强行剥夺走cpu的执行权限:为了实现并发的效果,这种情况是并发,可以提高效率                      大前提:一个CPU同一时刻只能执行一个任务           串行: 一行任务完全执行完毕,才会执行下一行           并发: 多个任务看起来是同时运行的,单核下就能实现并发(并发=切换+保存状态)           并行:

Python多线程

会有一股神秘感。 提交于 2019-12-21 23:51:57
一、线程概念 在程序运行时,操作系统会创建一个进程,并且会创建一个线程,这个线程就是主线程,主线程可以创建子线程。线程看上去同时运行,其实是按照并发执行的,走走停停,一直到所有形线程完成为止。线程像进程一样会有生命周期,如下所示: 将程序进行多线程编程,其性能会得到很大提升。python线程对CPU密集型性能提高不大,对I/O密集型性能提高很大。 二、多线程示例 import threading import time class myThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): out() #加入执行的程序代码 def out(): print_time1() print_time2() def print_time1(): print("Locka is acquired") print("Lockb is acwuired") def print_time2(): print("Lockb is acquired") time.sleep(2) print("Locka is acwuired") def main(): for i in range(50): t = myThread() t.start() #执行线程 main()

线程的那些事儿

岁酱吖の 提交于 2019-12-21 23:51:07
一、线程的基本概念:      线程被称为轻量级进程。   计算机的执行单位以线程为单位。计算机的最小可执行是线程。   进程是资源分配的基本单位。线程是可执行的基本单位,是可被调度的基本单位。   线程不可以自己独立拥有资源。线程的执行必须依赖所属进程中的资源。   进程中必须至少有一个线程。   由于GIL(全局解释锁,只在Cpython中有),导致线程没有真正的并行。   线程分为用户级线程和内核级线程。 二、进程由  代码段、数据段、PCB(进程控制块)组成   线程由  代码块、数据块、TCB(线程控制块)组成 三、线程和进程的比较   thread -- 线程   导入线程模块的两种方法:   import threading   from threading import Thread   (1) cpu 切换进程比切换线程 慢很多。在python中,如果IO操作过多的话,使用多线程最好了。   (2) 在同一进程内,所有线程共享这个进程的pid,也就是说所有的线程共享所属进程的资源和内存。   (3) 在同一个进程内,所有线程共享该进程中的全局变量   (4) 因为有GIL锁的存在,在Cpython中,没有真正的线程并行。但是有多进程并行      当任务是计算密集的情况下使用多进程。   (5) 守护线程和守护进程的区别      守护进程:要么自己正常结束

Selenium3+python自动化016-多线程

不问归期 提交于 2019-12-21 23:49:43
1、进程   什么是进程?   进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。   程序:例如xxx.py这是程序,是一个静态的   进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元。 2、线程 什么是线程?   线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。   线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。 3、线程与进程的区别   进程,能够完成多任务,比如 在一台电脑上能够同时运行多个QQ(QQ双开、微信双开)   线程,能够完成多任务,比如 一个QQ中的多个聊天窗口(一个人同时跟多个妹子聊天)   一个程序至少有一个进程,一个进程至少有一个线程.   线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高。  

python 中互斥锁 死锁

ぃ、小莉子 提交于 2019-12-21 23:46:35
互斥锁 互斥锁 : 对共享数据进行锁定, 保证同一时刻只能有一个线程去操作. 互斥锁的注意点 : 互斥锁是多个线程一起去抢, 抢到锁的线程先执行, 没有抢到锁的线程需要等待, 等互斥锁使用完释放后,其他等待的线程再去抢这个锁 互斥锁的使用 : threading 模块中定义了 Lock 变量, 这个变量本质上是一个函数, 通过调用这个函数可以获取一把互斥锁 # 创建锁 mutex = threading . Lock ( ) # 上锁 mutex . acquire ( ) 这里是同一时刻只有一个线程去操作的代码 , 对共享的数据进行锁定 # 释放锁 mutex . release ( ) 小黑板 acquire 和 release 方法之间的代码同一时刻只能有一个线程去操作 如果在调用 acquire 方法的时候, 其他线程已经使用了这个互斥锁, 那么此时 acquire 方法会堵塞, 直到这个互斥锁释放后才能再次上诉. with : with 的作用就是自动给这个线程加上互斥锁,自动释放这个互斥锁 import threading g_number = 0 # 全局变量多个线程可以读写,传递数据 def func ( lock ) : global g_number # 尝试加锁 lock . acquire ( ) for i in range ( 1000000 ) : g

python之多线程

空扰寡人 提交于 2019-12-21 04:44:58
一.什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于cpu),而一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一条流水线。 所以,进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。 多线程(即多个控制线程)的概念是,在一个进程中存在多个线程,多个线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源。例如,北京地铁与上海地铁是不同的进程,而北京地铁里的13号线是一个线程,北京地铁所有的线路共享北京地铁所有的资源,比如所有的乘客可以被所有线路拉。 二.线程与进程的区别 1.同一个进程内的多个线程共享该进程内的地址资源 2.创建线程的开销要远小于创建进程的开销(创建一个进程,就是创建一个车间,涉及到申请空间,而且在该空间内建至少一条流水线,但创建线程,就只是在一个车间内造一条流水线,无需申请空间,所以创建开销小) 三.开启线程方法 方法1: from threading import Thread import time def sayhi(name): time.sleep(2) print('%s say hello' %name)

2019/12/19 03-thread-local和Timer

不羁岁月 提交于 2019-12-21 02:32:32
threading.local 先看一下简单程序 asctime 时间,threadname线程明,message消息, logging在info级别,默认实在warning级别 现在里面写的就是未来的信息了,msg x就是上面的message消息 这5个线程用的都是局部的变量,这5个worker线程执行的时候互不干扰,每一个函数的局部变量x都是在这个线程上的栈压进去的,这些局部变量互不干扰。各自在各自的线程上 最后都是一样的 做一个猜测,只要你使用的局部变量,就是很安全的,只在各自的当前环境使用,只在线程这个函数的栈上使用,虽然这个对象可能在堆上创建的,但是只归这个函数使用,互不干扰 试试一个全局变量,全局的边界是当前模块,global x 告诉x是全局作用域去找 再执行一次 前面线程加完,全局x刚用完,后面线程来的时候,紧接着代表全局变量直接加了,最后都是500次的加,次数是不会少的,该加多少是多少 如果要每次加都得到100,就需要使用局部变量,不能使用none local(none local 是在本地作用域不定义,在外层非global的区域定义,这里使用none local就到全局里去了 现在添加一个类,用一个全局的实例来解决a.x+1 如果想每次得到的结果是100,但是又想用全局变量,该如何做,python提供了local这样的一个类 定义了__slots__就是两个属性