python多线程

python学习笔记之使用threading模块实现多线程(转)

做~自己de王妃 提交于 2020-03-02 12:35:43
综述 Python这门解释性语言也有专门的线程模型,Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,但暂时无法利用多处理器的优势。 在Python中我们主要是通过thread和 threading这两个模块来实现的,其中Python的threading模块是对thread做了一些包装的,可以更加方便的被使用,所以我们使用 threading模块实现多线程编程。这篇文章我们主要来看看Python对多线程编程的支持。 在语言层面,Python对多线程提供了很好的支持,可以方便地支持创建线程、互斥锁、信号量、同步等特性。下面就是官网上介绍threading模块的基本资料及功能: 实现模块 thread:多线程的底层支持模块,一般不建议使用; threading:对thread进行了封装,将一些线程的操作对象化 threading模块 Thread 线程类,这是我们用的最多的一个类,你可以指定线程函数执行或者继承自它都可以实现子线程功能; Timer与Thread类似,但要等待一段时间后才开始运行; Lock 锁原语,这个我们可以对全局变量互斥时使用; RLock 可重入锁,使单线程可以再次获得已经获得的锁; Condition 条件变量,能让一个线程停下来,等待其他线程满足某个“条件”; Event 通用的条件变量

python之线程

大憨熊 提交于 2020-03-02 04:01:09
什么是线程? 线程是CPU上的执行单位。 线程和进程的区别 1、进程是资源的集合,是一个资源单位。线程是CPU上是执行单位。所以开进程开销与远大于开线程 2、进程单独开辟内存空间。同一个进程内多线程共享同一个内存空间 a = 100 def task(): global a a = 0 if __name__ == '__main__': # p = Process(target=task, ) # p.start() # p.join() # print(a) # 100 t = Thread(target=task, ) t.start() t.join() print(a) # 0 3、开多个进程,每个进程有不同的pid。在主进程下开启多个线程,每个线程的pid和主进程的pid一样 Thread对象的其他用法 from threading import Thread, current_thread, active_count, enumerate import time def task(): print("子进程", current_thread().getName(), current_thread().name) # current_thread().getName() == current_thread().name time.sleep(2) if __name__

多线程,协程,进程;并发,并行;异步;非阻塞;

时光总嘲笑我的痴心妄想 提交于 2020-03-01 15:35:34
进程: 是资源分配的最小单位; ² 调度由操作系统完成; ² 进程空间独立,数据安全性好,有专门的进程间通信方法 ² 进程的创建和删除要比线程消耗更多的计算机资源 ² 有独立的内存空间(上下文切换的时候需要保存栈、cpu寄存器、虚拟内存、以及打开的相关句柄等信息,开销大) 1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立 2、稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制 线程: 是程序执行的最小单位(资源调度最小单位); ² 一个进程可以有多个线程,每个线程会共享父进程的资源(创建线程开销占用比进程小很多,可创建的数量也会很多) ² 线程的使用会给系统带来上下文切换的额外负担; ² 一个进程可以包含多个线程,线程共享进程的资源空间 1、CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源 2、如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃 协程: ² 调度完全由用户控制; ² 一个线程(进程)可以有多个协程; ² 每个线程(进程)循环按照指定的任务清单顺序完成不同的任务(当任务被堵塞时,执行下一个任务;当恢复时,再回来执行这个任务;任务间切换只需要保存任务的上下文,没有内核的开销,可以不加锁的访问全局变量)

Java并发编程:深入剖析ThreadLocal

我怕爱的太早我们不能终老 提交于 2020-03-01 10:34:29
个人博客导航页(点击 右侧 链接 即可打开个人博客): 大牛带你入门技术栈 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。   以下是本文目录大纲:   一.对ThreadLocal的理解   二.深入解析ThreadLocal类   三.ThreadLocal的应用场景   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:    http://www.cnblogs.com/dolphin0520/p/3920407.html 一.对ThreadLocal的理解 ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。   这句话从字面上看起来很容易理解,但是真正理解并不是那么容易。   我们还是先来看一个例子: class ConnectionManager { private static Connection connect = null; public static

NO.2 Android 线程间交互

社会主义新天地 提交于 2020-03-01 10:05:14
NO.2 Android 线程间交互 零蚀 线程的终止 一个线程终止另一个线程 Thread thread = new Thread ( new Runnable ( ) { @Override public void run ( ) { } } ) ; thread . start ( ) ; thread . stop ( ) ; 线程里 有一个非常有效的终止线程的方法,可以使用stop来有效的结束一个线程,但是这个api在4.1的时候就已经被弃用了,因为结果是不可预期的,当结束线程时候,不能了解到线程所做的工作是什么,所以对这种不可控的因素,是不可靠的。 Thread thread = new Thread ( ) { @Override public void run ( ) { //重置interrupt的状态 if ( Thread . interrupted ( ) ) { // 收尾 return ; } // 下面的方法不会改变interrupt标记的状态 //if(isInterrupted()){ // return; //} } } ; thread . start ( ) ; thread . interrupt ( ) ; interrupt方法并非像stop即死,它是给这个线程做个中断标记。通知线程将被中断。如果线程在合适的位置进行终止,如上述代码。

Python:使用threading模块实现多线程(转)

ぐ巨炮叔叔 提交于 2020-02-29 08:58:11
Python:使用threading模块实现多线程(转) 分类: python 标签: thread 评论: 暂无评论 阅读:5,420 views 综述 Python这门解释性语言也有专门的线程模型,Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,但暂时无法利用多处理器的优势。 在Python中我们主要是通过thread和 threading这两个模块来实现的,其中Python的threading模块是对thread做了一些包装的,可以更加方便的被使用,所以我们使用 threading模块实现多线程编程。这篇文章我们主要来看看Python对多线程编程的支持。 在语言层面,Python对多线程提供了很好的支持,可以方便地支持创建线程、互斥锁、信号量、同步等特性。下面就是官网上介绍threading模块的基本资料及功能: 实现模块 thread:多线程的底层支持模块,一般不建议使用; threading:对thread进行了封装,将一些线程的操作对象化 threading模块 Thread 线程类,这是我们用的最多的一个类,你可以指定线程函数执行或者继承自它都可以实现子线程功能; Timer与Thread类似,但要等待一段时间后才开始运行; Lock 锁原语,这个我们可以对全局变量互斥时使用; RLock

python语法基础-并发编程-线程-线程池

核能气质少年 提交于 2020-02-29 08:55:32
############### 线程池 ############## """ 池 —— concurrent.futures Python标准模块--concurrent.futures concurrent.futures模块提供了高度封装的异步调用接口,其中: ThreadPoolExecutor:线程池 ProcessPoolExecutor: 进程池 借助上面两个类,我们可以很方便地创建进程池对象和线程池对象。 p_pool = ProcessPoolExecutor(max_workers=5) # 创建一个最多5个woker的进程池 t_pool = ThreadPoolExecutor(max_workers=5) # 创建一个最多5个woker的线程池 可用方法介绍: # 基本方法 # submit(fn, *args, **kwargs) 提交任务 # map(func, *iterables, timeout=None, chunksize=1) 取代for循环submit的操作 # shutdown(wait=True) 相当于进程池的pool.close()+pool.join()操作 wait=True,等待池内所有任务执行完毕回收完资源后才继续 wait=False,立即返回,并不会等待池内的任务执行完毕 但不管wait参数为何值

python语法基础-并发编程-线程-其他

一笑奈何 提交于 2020-02-29 08:55:00
############### 信号量和事件 ############## # 信号量 # 信号量就是控制只能有n个线程能访问这段代码 # from threading import Semaphore,Thread # import time # def func(sem,a,b): # sem.acquire() # time.sleep(1) # print(a+b) # sem.release() # # sem = Semaphore(4) # for i in range(10): # t = Thread(target=func,args=(sem,i,i+5)) # t.start() # 事件: # 事件被创建的时候是false状态,这个false状态会导致wait被阻塞, # true状态的时候,wait就不阻塞了 # clear,设置为false # set,设置状态未false, # 上次举例的是红绿灯的例子, # 现在我们举一个例子,检测数据库的可连接情况 # 启动两个线程, # 第一个线程连接数据库, # 等待一个信号,告诉我们之间的网络是通的 # 第二个线程,检测和数据自己之间的网络是否是通的 # 通了之后把事件的状态改为true, import time,random from threading import Thread,Event def

python多线程(条件变量同步)

跟風遠走 提交于 2020-02-29 08:21:36
互斥锁 是最简单的线程同步机制,Python提供的Condition对象提供了对复杂线程同步问题的支持。Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。不断的重复这一过程,从而解决复杂的同步问题。 可以认为Condition对象维护了一个锁(Lock/RLock)和一个waiting池。线程通过acquire获得Condition对象,当调用wait方法时,线程会释放Condition内部的锁并进入blocked状态,同时在waiting池中记录这个线程。当调用notify方法时,Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。 Condition对象的构造函数可以接受一个Lock/RLock对象作为参数,如果没有指定,则Condition对象会在内部自行创建一个RLock。 除了notify方法外,Condition对象还提供了notifyAll方法,可以通知waiting池中的所有线程尝试acquire内部锁。由于上述机制

线程和进程——python的多线程

China☆狼群 提交于 2020-02-28 14:00:04
    首先要分清楚这两个概念。          进程:一个具有独立功能的程序关于某个数据集合的一次运行活动。其一,它是一个实体;其二,是一个“执行中的程序”。     线程:进程里包含的执行单元叫线程,一个进程可以包含多个线程。它是cpu的基本调度单位。     一个进程的内存空间是可以被它的线程共享的,但是一个线程在使用时,其它线程必须等待。通过“锁”防止多个线程同时占用空间。     在不同线程同时访问时,数据的保护机制是怎样的呢?这就要提到python的一个“锁”——GIL(全称为全局解释器锁),要想利用多核系统,Python必须支持多线程运行。作为解释型语言,Python的解释器必须做到既安全又高效。我们都知道多线程编程会遇到的问题。解释器要留意的是避免在不同的线程操作内部共享的数据。同时它还要保证在管理用户线程时保证总是有最大化的计算资源。所以python就有了这么一个“锁”。这是一个让人头疼的问题,“锁”的存在解决了那一些麻烦,但是也牺牲了python的多线程能力。     python的多线程适合于:大量密集的I/O处理     python的多进程:大量的密集并行计算     尽管python的多线程功能看起来比较鸡肋,但是在爬虫中的应用,还是可以提高效率的。 1 import requests 2 import threading #使用线程库 3 from