线程

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 通用的条件变量

[Android] android的消息队列机制

ε祈祈猫儿з 提交于 2020-03-02 12:30:19
android下的线程,Looper线程,MessageQueue,Handler,Message等之间的关系,以及Message的send/post及Message dispatch的过程。 Looper线程 我 们知道,线程是进程中某个单一顺序的控制流,它是内核做CPU调度的单位。那何为Looper线程呢?所谓Looper线程,即是借助于Looper和 MessageQueue来管理控制流的一类线程。在android系统中,application的主线程即是借助于Looper和 MessageQueue来管理控制流的。其实,不仅仅只有主线程可以用Looper和MessageQueue来管理控制流,其他的线程也一样可以。我 们可以先看一下android source code的注释中给出的一种Looper线程的实现方式: package com.example.messagequeuedemo; import android.os.Handler; import android.os.Looper; import android.util.Log; public class LooperThread extends Thread { public static final String TAG = MainActivity.TAG; private static final

Python - 协程

本小妞迷上赌 提交于 2020-03-02 12:07:50
一、简介 协程是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是协程: 协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。 需要强调的是: # 1.python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cup执行权限,切换其它线程运行) # 2.单线程内开户协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(非io操作的切换与效率无关) 对比操作系统控制线程的切换,用户在单线程内控制协程的切换 优点如下: # 1.协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级 # 2.单线程内就可以实现并发的效果,最大限度地利用cpu 缺点如下: # 1.协程的本质是单线程,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程 # 2.协程指的是单线程,因而一旦协程出现阻塞,将会阻塞整个线程 总结协程特点: 1. 必须在只有一个单线程里实现并发 2. 修改共享数据不需要加锁 3. 用户程序里自己保存多个控制流的上下文栈 附加:一个协程遇到IO操作自动切换到其它协程(如何实现检测IO,yield,greenlet都无法实现,就用到了gevent模块(select机制)) 二、Greenlet 如果我们在单个线程内有20个任务

Java的守护线程

拜拜、爱过 提交于 2020-03-02 12:07:18
如果非守护线程全部结束,则程序结束,同时杀死所有守护线程。 线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现 thread.setDaemon(true)必须在thread.start()之前设置,不能把正在运行的常规线程设置为守护线程 在Daemon线程中产生的新线程也是Daemon的 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。 来源: CSDN 作者: fall_hat 链接: https://blog.csdn.net/fall_hat/article/details/104546706

iOS NSThread、NSOperation与GCD

对着背影说爱祢 提交于 2020-03-02 11:43:34
一、NSThread线程 优点: NSThread 比其他两个轻量级、使用方便、简洁。 缺点: ①需要自己管理线程的生命周期。 ②线程同步,线程同步对数据的加锁会有一定的系统开销 NSThread线程的使用: 启动一个线程 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadTask) object:nil]; thread.name=@"sum"; [thread start] 停止线程 [thread cancel]; thread = nil; 注意:停止线程的并不是直接杀死线程,而是设置了个标记 -(void) myThreadTask{ @autoreleasepool { NSLog(@"Thread Entry Point"); while ([[NSThread currentThread] isCancelled] == NO){ [NSThread sleepForTimeInterval:10]; NSLog(@"Thread Loop"); } NSLog(@"Thread Finished"); } } 还有一类用法如下: [NSThread detachNewThreadSelector:@selector(bigDemo)

深入理解G1垃圾收集器

依然范特西╮ 提交于 2020-03-02 11:37:54
深入理解G1垃圾收集器 G1 GC是Jdk7的新特性之一、Jdk7+版本都可以自主配置G1作为JVM GC选项;作为JVM GC算法的一次重大升级、DK7u后G1已相对稳定、且未来计划替代CMS、所以有必要深入了解下: 不同于其他的分代回收算法、G1将堆空间划分成了互相独立的区块。每块区域既有可能属于O区、也有可能是Y区,且每类区域空间可以是不连续的(对比CMS的O区和Y区都必须是连续的)。这种将O区划分成多块的理念源于:当并发后台线程寻找可回收的对象时、有些区块包含可回收的对象要比其他区块多很多。虽然在清理这些区块时G1仍然需要暂停应用线程、但可以用相对较少的时间优先回收包含垃圾最多区块。这也是为什么G1命名为Garbage First的原因:第一时间处理垃圾最多的区块。 平时工作中大多数系统都使用CMS、即使静默升级到JDK7默认仍然采用CMS、那么G1相对于CMS的区别在: G1在压缩空间方面有优势 G1通过将内存空间分成区域(Region)的方式避免内存碎片问题 Eden, Survivor, Old区不再固定、在内存使用效率上来说更灵活 G1可以通过设置预期停顿时间(Pause Time)来控制垃圾收集时间避免应用雪崩现象 G1在回收内存后会马上同时做合并空闲内存的工作、而CMS默认是在STW(stop the world)的时候做 G1会在Young GC中使用

7.3. 锁定事宜

回眸只為那壹抹淺笑 提交于 2020-03-02 11:35:16
7.3. 锁定事宜 7.3.1. 锁定方法 7.3.2. 表锁定事宜 7.3.1. 锁定方法 MySQL 5.1 支持对 MyISAM 和 MEMORY 表进行表级锁 定,对 BDB 表进行页级锁定,对 InnoDB 表进行行级锁定。 在许多情况下,可以根据培训猜测应用程序使用哪类锁定类型最好,但一般很难说出某个给出的锁类型就比另一个好。一切取决于应用程序,应用程序的不同部分可 能需要不同的锁类型。 为了确定是否想要使用行级锁定的存储引擎,应看看应用程序做什么并且混合使用什么样的选择和更新语句。例如,大多数 Web 应 用程序执行许多选择,而很少进行删除,只对关键字的值进行更新,并且只插入少量具体的表。基本 MySQL MyISAM 设置已经调节得很好。 在 MySQL 中对于使用表级锁定的存储引擎,表锁定时不会死锁的。这通过总是在一个查询开始时立即请求所有必要的锁定并且 总是以同样的顺序锁定表来管理。 对 WRITE , MySQL 使 用的表锁定方法原理如下: 如果在表上没有锁,在它上面放一个写锁。 否则,把锁定请求放在写锁定队列中。 对 READ , MySQL 使用的锁定方法 原理如下: 如果在表上没有写锁定,把一个读锁定放在它上面。 否则,把锁请求放在读锁定队列中。 当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线程。 这意味着

Handlers, MessageQueue, Looper, do they all run on

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-02 11:25:17
http://stackoverflow.com/questions/5193913/handlers-messagequeue-looper-do-they-all-run-on-the-ui-thread/5193981#5193981 Short answer: they all run on the same thread. If instantiated from an Activity lifecycle callback, they all run on the main UI thread. Long answer: A thread may have a Looper, which contains a MessageQueue. In order to use this facility, you would have to create a Looper on the current thread by calling (the static) Looper.prepare(), and then start the loop by calling (the also static) Looper.loop(). These are static because there is only supposed to be one Looper per

N种内核注入DLL的思路及实现

瘦欲@ 提交于 2020-03-02 10:48:06
内核注入 ,技术古老但很实用。现在部分RK趋向无进程,玩的是 SYS+DLL ,有的无文件,全部存在于内存中。可能有部分人会说:“都进内核了.什么不能干?”。是啊,要是内核中可以做包括R3上所有能做的事,软件开发商们也没必要做应用程序了。有时,我们确实需要R3程序去干驱动做起来很困难或者没必要驱动中去做的事,进程 / DLL是不错的选择,但进程目标太大,所以更多的同学趋向于注DLL。 若要开发安全软件、小型工具,可借鉴其思路,Anti Rootkits时,在某些极端情况下,可使用同样的技术发现、清除RK,保证用户电脑的正常使用。在此,我将探讨几种内核注入DLL的思路及实现原理。 (1) APC 技术 给一个Alertbale的用户态线程插APC,让其执行其中的ShellCode,来执行我们的代码。这个方法简单易行,但是不够稳定,兼容性不好。测试中发现经常出现Explorer.exe等插崩溃的情况,而且有杀软在的情况下,插入有时会被拦截,起不到应有的效果。(可参考我以前逆过的一个驱动: 逆向fuck.sys--编译通过--源码 ) (2) 内核Patch [url=file://KnownDLLs/Kernel32.dll]\\KnownDLLs\\Kernel32.dll[/url] CreateThread [url=file://KnownDLLs/]\\KnownDLLs[

单例模式、读写锁

喜夏-厌秋 提交于 2020-03-02 10:18:06
单例模式 是设计模式中的一种,是大佬们针对典型场景设计的解决方案。 典型场景:一个对象/一个资源 只能被初始化加载一次 。 例如:你在打游戏的时候,游戏有很多图片资源。希望一个图片只加载一次。 实现方式 : 饿汉/懒汉 饿汉:所有资源在程序初始化阶段 一次性 完成初始化(资源在初始化的时候一次性全部加载,后续只需要使用就可以) template<class T> class single { static T _data;//所以实例化的对象共用同一份资源 T* get_instance() { return &_data; } } 资源初始化的时候会慢一点,但是运行起来以后,会很流畅。 懒汉:资源在 使用的时候 进行初始化(用到的时候再去加载,当然也要保证只加载一次) template <typename T> class Singleton { static T* inst; public: static T* GetInstance() { if (inst == NULL) { inst = new T(); } return inst; } } 在使用的时候加载一次资源,会涉及到线程安全问题。(volatile、static、mutex、二次判断) 使用static保证多个对象使用 同一份 空间资源。(保证资源只被加载一次,实现单例模式) 加锁保护资源申请过程