线程

Python_协程

邮差的信 提交于 2020-03-02 22:26:31
引子   之前我们学习了线程、进程的概念,了解了在操作系统中 进程是资源分配的最小单位,线程是CPU调度的最小单位。 按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建进程、创建线程、以及管理他们之间的切换。   随着我们对于效率的追求不断提高, 基于单线程来实现并发 又成为一个新的课题,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发。这样就可以节省创建线进程所消耗的时间。   为此我们需要先回顾下并发的本质:切换+保存状态   cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长       ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态    一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。   为此我们可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: #1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级

MySQL复制技术

南笙酒味 提交于 2020-03-02 21:50:08
文章目录 原理 配置 实验 GTID 原理 复制原理 mster的I/O线程会将DML等语句写入binlog中。 slave的I/O线程会请求master的log dump线程,将读取到的binlog的文件名和位置记录到master-info文件中,以便下次向master直接要该位置后的数据,并将binlog写入relay log。 slave的SQL线程会定时检查relay log,完成更新。 复制技术 异步复制 master提交事务后,通知dump线程将bonlog发送slave的I/O线程,然后master就继续处理事务,不等待slvaer服务器同步是否完成。 半同步复制 master提交事务后,通知dump线程将bonlog发送slave的I/O线程,至少一个slave将binlog写入到relay log后,mater才能继续处理事务。相当于给一个slave同步,其他slave异步。 同步复制 master提交事务后,通知dump线程将bonlog发送slave的I/O线程,当所有从库都同步完成该事务后,mater才能继续处理事务。 复制中,异步master不用等待slave同步反馈,所以性能最高,但可靠性最低;同步master必须等待全部slave同步反馈,所以性能最低,但可靠性最高;而半同步,在数据安全上我们确认slave至少有一台同步完成,在速度方面也是折中

(一)移动GPU初探

我是研究僧i 提交于 2020-03-02 20:14:58
原文链接: https://www.sohu.com/a/252890063_505795 人工智能的飞速发展,需要强大的算力作为支撑,这背后NIVIDIA可谓是当之无愧的功臣。NIVIDIA先进的GPU技术和优异的软件生态,使其在竞争中脱颖而出,成为市场霸主。目前人工智能在图像处理及语音识别领域的研究取得了很好的发展,在手机和安防领域也有很多产品落地。在落地过程中,依然会面临设备算力的问题,而移动端GPU则自然而然的进入了人们的视野。 移动端GPU厂商的发展史 在移动端GPU市场中,没有形成一家独大的竞争格局。目前主要的移动端GPU厂商有高通,arm和imaginaton。高通的adreno来自ATI的imageon,ATI最早被AMD收购,后来高通收购了AMD的移动设备资产,取得了AMD的矢量绘图与3D绘图技术和相关知识产权。后来高通结合AMD的手机图形技术发展为自家的Adreno图形处理器。另一家移动计算的巨头ARM,ARM在移动CPU的市场地位可谓遥不可及,但是在GPU领域,它确是诸多厂商中的一家,他的GPU业务也并非一开始就拥有,而是后来组建的。其GPU技术来自一家名为Falanx的公司,这家公司是早起从挪威大学脱离出来的一个名为mali的研究小组的成员组建的,最早定位于PC领域,失利后转向SoC GPU设计。随着SoC市场的不断壮大,以及移动计算的发展

time.sleep —休眠线程或进程?

元气小坏坏 提交于 2020-03-02 18:30:44
在Python for * nix中, time.sleep() 阻塞线程或进程? #1楼 只有线程,除非您的进程具有单个线程。 #2楼 进程本身无法运行。 关于执行,进程只是线程的容器。 这意味着您根本无法暂停该过程。 它根本不适用于过程。 #3楼 只是线程。 #4楼 它只会休眠线程,除非您的应用程序只有一个线程,在这种情况下,它将休眠线程并有效地进程。 睡眠中的python文档未指定此内容,因此我当然可以理解混淆! http://docs.python.org/2/library/time.html #5楼 该线程将阻塞,但是该进程仍然有效。 在单线程应用程序中,这意味着您在睡眠时一切都被阻止了。 在多线程应用程序中,只有您显式“睡眠”的线程将被阻塞,其他线程仍在进程中运行。 来源: oschina 链接: https://my.oschina.net/u/3797416/blog/3185329

读《软件调试》第九章

ぐ巨炮叔叔 提交于 2020-03-02 18:14:52
今日读了张银奎老师的《软件调试》,前面的CPU和硬件相关的部分离得比較远,所以从第九章操作系统读起,今天的读书笔记: 9.2採集调试消息 调试事件分为8种 typedef enum _DBGKM_APINUMBER { DbgkmExceptionApi = 0, // 异常 DbgkmCreateThreadApi = 1, // 创建线程 DbgkmCreateProcessApi = 2, // 创建进程 DbgkmExitThreadApi = 3, // 退出线程 DbgkmExitProcessApi = 4, // 进程退出 DbgkmLoadDllApi = 5, // 映射DLL DbgkmUnloadDllApi = 6, // 反映射DLL DbgkmErrorReportApi = 7, // 内部错误 DbgkmMaxApiNumber = 8, // 这组常量的最大值 } DBGKM_APINUMBER; 9.2.2 进程和线程创建消息 操作系统就支持向调试系统发送消息,这个我是没有想到的,详细步骤例如以下: 创建用户态windows线程时,首先为线程建立必要的内核对象和数据结构,并分配栈(stack)空间,这些工作完毕后, 该线程处于挂起状态(CREATE_SUSPEND), 而后进程管理器会通知环境子系统,环境子系统会作必要的设置和登记,最后

interrupt ,interrupted,isInterrupted 区别

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-02 18:11:19
1、interrupt interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。 注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。 2.interrupted 是作用于当前线程,isInterrupted 是作用于调用该方法的线程对象所对应的线程。(线程对象对应的线程不一定是当前运行的线程。例如我们可以在A线程中去调用B线程对象的isInterrupted方法。) 这两个方法最终都会调用同一个方法,只不过参数一个是true,一个是false; 这两个方法很好区分,只有当前线程才能清除自己的中断位(对应interrupted()方法) package com.famous.thread; public class ThreadStopDemo { /** * * mock thread stop * * @author zhenglong * */ public static void main(String[] args) { Thread thread = new Thread(new StopThread()); thread.start

sqlalchemy 多线程 创建session

若如初见. 提交于 2020-03-02 18:03:50
1、基于threding.local,推荐使用 from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session from models import Student from threading import Thread engine = create_engine( "mysql+pymysql://root:密码@127.0.0.1:3306/数据库?charset=utf8", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) SessionFactory = sessionmaker(bind=engine) session = scoped_session(SessionFactory) def task(): ret = session.query(Student).all() # 将连接交还给连接池 session.remove() for i in range(20):

进程和线程

柔情痞子 提交于 2020-03-02 17:53:28
简单理解进程: 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。 简单理解线程: 有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。 进程和线程的关系: 由于每个进程至少要干一件事,所以,一个进程至少有一个线程。当然,像Word这种复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方式和多进程是一样的,也是由操作系统在多个线程之间快速切换,让每个线程都短暂地交替运行,看起来就像同时执行一样。当然,真正地同时执行多线程需要多核CPU才可能实现。 线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。 多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂。 这个文章写得比较详细: https://blog.csdn.net/mxsgoden/article/details/8821936 中间涉及到并发和并行,这篇文章可以很方便的理解: https://www.jianshu

关于java中的interrupt

安稳与你 提交于 2020-03-02 17:15:37
一、概念 java中线程有开始,运行(就绪,运行),阻塞,等待,终止这几种状态。其中在等待的时候可以通过设置中断标志位来唤醒线程。一般情况下等待状态的线程检查到中断标志被置位,则会抛出InterruptedException异常,捕获异常,复位中断标志,可以使线程继续运行。 thread.interrupt() 设置中断标识位 Thread.interrupt() 回复中断标识位 thread.isInterrupted() 返回中断标识位 什么情况下可以使用Interrunpt (1)如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个InterruptedException异常。这个时候,我们可以通过捕获InterruptedException异常来终止线程的执行,具体可以通过return等退出或改变共享变量的值使其退出。 (2)如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException。这时候处理方法一样

interrupt、interrupted 、isInterrupted 区别

元气小坏坏 提交于 2020-03-02 17:04:36
1、interrupt interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。 注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。 2、interrupted 和 isInterrupted 首先看一下该方法的实现: public static boolean interrupted () { return currentThread().isInterrupted(true); } 该方法就是直接调用 当前线程 的isInterrupted(true)方法。 然后再来看一下 isInterrupted的实现: public boolean isInterrupted () { return isInterrupted( false); } 这两个方法有两个主要区别: interrupted 是作用于当前线程,isInterrupted 是作用于调用该方法的线程对象锁对应的线程。(线程对象对应的线程不一定是当前运行的线程。例如我们可以再A线程去调用B线程的isInterrupted方法。) 这两个方法最终都会调用同一个方法