多进程

线程同步锁、死锁、递归锁、信号量、GIL

匿名 (未验证) 提交于 2019-12-03 00:09:02
Ŀ¼ 所有线程同一时间读写同一个数据,有的线程已经对数据进行修改了,造成有的线程拿到的数据时旧的数据,而不是修改后的数据,造成结果不正确,于是引入了同步锁解决问题, 同步锁的原理是同一时间只能有一个线程读写数据。 锁通常被用来实现对共享资源的同步访问。从threading模块导入一个Lock类,为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其他线程已经获得了该锁,则当前线程需等待其被释放),待资源访问完后,再调用release方法释放锁。 下面这个例子就需要用到同步锁: from threading import Thread x = 0 def task(): global x for i in range(20000): x=x+1 # t1 的 x刚拿到0 保存状态 就被切了 # t2 的 x拿到0 进行+1 1 # t1 又获得运行了 x = 0 +1 1 # 思考:一共加了几次1? 加了两次1 真实运算出来的数字本来应该+2 实际只+1 # 这就产生了数据安全问题. if __name__ == '__main__': t1 = Thread(target=task) t2 = Thread(target=task) t3 = Thread(target=task) t1.start() t2.start() t3

多进程执行分布式自动化测试

匿名 (未验证) 提交于 2019-12-02 22:56:40
场景: 进入搜狗,输入搜索关键字进行搜索 利用多进程分布式实现 from multiprocessing import Pool import os, time from selenium import webdriver from selenium.webdriver.common.keys import Keys from multiprocessing import Manager, current_process import traceback #定义测试行为函数:此处为打开搜狗搜索内容 def node_task(name, lock, arg, successTestCases, failTestCases): """ :param name: 执行进程名 :param lock:进程间的共享资源锁 :param arg:node节点计算机、浏览器字典 ,如:{"node": "http://127.0.0.1:6666/wd/hub", "browserName": "chrome"} :param successTestCases:成功执行用例列表 :param failTestCases:失败用例列表 :return:返回成功执行、失败执行的用例列表 """ procName = current_process().name print("当前进程名:"

异步协程太吊了!以亲测!简直完美,Python异步协程的葵花宝典!

匿名 (未验证) 提交于 2019-12-02 22:56:40
2.1 阻塞 阻塞状态指程序未得到所需计算资源时被挂起的状态。程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的。 常见的阻塞形式有:网络 I/O 阻塞、磁盘 I/O 阻塞、用户输入阻塞等。阻塞是无处不在的,包括 CPU 切换上下文时,所有的进程都无法真正干事情,它们也会被阻塞。如果是多核 CPU 则正在执行上下文切换操作的核不可被利用。 2.5 多进程 多进程就是利用 CPU 的多核优势,在同一时间并行地执行多个任务,可以大大提高执行效率。 2.6 协程 协程,英文叫做 Coroutine,又称微线程,纤程,协程是一种用户态的轻量级线程。 3.1 定义协程 首先我们来定义一个协程,体验一下它和普通进程在实现上的不同之处,代码如下: 首先我们引入了 asyncio 这个包,这样我们才可以使用 async 和 await,然后我们使用 async 定义了一个 execute() 方法,方法接收一个数字参数,方法执行之后会打印这个数字。 这里我们定义了 loop 对象之后,接着调用了它的 create_task() 方法将 coroutine 对象转化为了 task 对象,随后我们打印输出一下,发现它是 pending 状态。接着我们将 task 对象添加到事件循环中得到执行,随后我们再打印输出一下 task 对象,发现它的状态就变成了 finished

python多线程建立代理ip池

匿名 (未验证) 提交于 2019-12-02 22:51:30
之前有写过用单线程建立代理ip池,但是大家很快就会发现,用单线程来一个个测试代理ip实在是太慢了,跑一次要很久才能结束,完全无法忍受。所以这篇文章就是换用多线程来建立ip池,会比用单线程快很多。之所以用多线程而不是多进程,是因为测试时间主要是花费在等待网络传递数据上,处理本地计算的时间很短,用多线程能更好地发挥单核性能,而且多线程开销比多进程开销小得多。当然,单核性能会有极限,如果想再提高性能就需要多进程和多线程混用了。当然这里说的是用CPython作为解释器时候的情况,因为绝大多数人用的都是CPython,所以以下说的都是这种情况。 受限于个人学识,对多进程和多线程的理解也不是很深刻,如果以后有机会会写写关于并发编程的文章。CPython因为GIL锁的原因,多线程无法发挥多核性能,但是可以用多进程来发挥多核性能。注意GIL锁不是python语言特性,只是CPython解释器的原因。任何python线程在执行前,都必须获得GIL锁,然后每执行100条字节码,解释器就自动释放GIL锁,让别的线程执行。所以python线程只能交替执行,即使有多个线程跑在多核CPU上,也只能利用一个核。 其实程序主体在之前的文章已经写好了,我们需要的只是稍微做点改进,以适合多线程编程。我的思路是,设置一个线程专门用来爬取待测试ip,其他线程获取待测试ip进行测试。这也是分布式编程的思想。

Python连载37-多进程、进程子类、进程父子id

匿名 (未验证) 提交于 2019-12-02 22:51:30
一、线程替代方案 1.subprocess (1)完全跳过线程,使用进程 (2)是派生进程的主要替代方案 (3)python2.4后引入 2.multiprocessing (1)使用threading接口派生,使用子进程 (2)允许为多核或者多CPU派生进程,接口很threading非常相似 (3)python2.6 3.concurrent.futures (1)新的异步执行模块 (2)人物级别的操作 (3)python3.2之后引入 4.多进程 (1)进程间通讯(InterprocessCommunication,IPC) (2)进程之间无任何共享状态 (3)进程的创建 i.直接生成Process实例对象,举例 import multiprocessing from time import sleep , ctime def clock ( interval ): while True : print ( "The time is %s" % ctime ()) sleep ( interval ) if __name__ == "__main__" : p = multiprocessing . Process ( target = clock , args =( 2 ,)) p . start () #从运行就可以看出来主进程已经结束了,但是子线程仍然在运行着

24式加速你的Python!

匿名 (未验证) 提交于 2019-12-02 22:51:08
重磅干货,第一时间送达 一,分析代码运行时间 第1式,测算代码运行时间 平凡方法 Python学习交流群:1004391443,这里是python学习者聚集地,有大牛答疑,有资源共享!小编也准备了一份python学习资料,有想学习python编程的,或是转行,或是大学生,还有工作中想提升自己能力的,正在学习的小伙伴欢迎加入学习。 快捷方法(jupyter环境) 第2式,测算代码多次运行平均时间 平凡方法 快捷方法(jupyter环境) 第3式,按调用函数分析代码运行时间 平凡方法 快捷方法(jupyter环境) 第4式,按行分析代码运行时间 平凡方法 快捷方法(jupyter环境) 二,加速你的查找 第5式,用set而非list进行查找 低速方法 高速方法 第6式,用dict而非两个list进行匹配查找 低速方法 高速方法 三,加速你的循环 第7式,优先使用for循环而不是while循环 低速方法 高速方法 第8式,在循环体中避免重复计算 低速方法 高速方法 四,加速你的函数 第9式,用循环机制代替递归函数 低速方法 高速方法 第10式,用缓存机制加速递归函数 低速方法 高速方法 第11式,用numba加速Python函数 低速方法 高速方法 五,使用标准库函数进行加速 第12式,使用collections.Counter加速计数 低速方法 高速方法 第13式

python之多线程与多进程

匿名 (未验证) 提交于 2019-12-02 22:11:45
1. 多进程与多线程 (1) 背景: 为何需要多进程或者多线程: 在同一时间里,同一个计算机系统中如果允许两个或者两个以上的进程处于运行状态,这便是多任务。多任务会带来的好处例如用户边听歌、边上网、边打印,而这些任务之间丝毫不会互相干扰。使用多进程技术,可大大提高计算机的运算速率。 (2) 多进程与多线程的区别: 进程 :程序在计算机上的一次执行活动。进程分为:系统进程和用户进程。 当运行一个程序时,实际就是启动了一个进程。程序是死的(静态的),进程是活的(动态的)。 线程 :是程序中的一个单一的顺序控制流程。 CPU的基本单元(指运行中程序的调度单位)。 CPU调度的最小单位。 CPU运行程序代码并操作程序的数据所形成的。因此,线程被认为是以CPU为主体的行为。 多线程程序设计的含义就是可以将程序任务分成几个并行的子任务。 Windows系统中,进行CPU分配是以线程为单位的,一个进程可能由多个线程组成,这种情况更加复杂,有如下关系: <=CPU数量,并行运行 >CPU数量,并发运行。 并行运行的效率明显高于并发运行。 2. 多进程编程 进程的概念 第一,进程是一个实体,每一个进程都有它自己的地址空间,一般情况下,包括文本区域、数据区域和堆栈区域。 文本区域:存储处理器执行的代码; . 堆栈区域:存储着活动过程中调用的指令和本地变量。 第二,“执行中的程序”

Python多进程fork()函数详解

匿名 (未验证) 提交于 2019-12-02 22:11:45
进程 进程是程序的一次动态执行过程,它对应了从代码加载、执行到执行完毕的一个完整过程。进程是系统进行资源分配和调度的一个独立单位。进程是由代码(堆栈段)、数据(数据段)、内核状态和一组寄存器组成。 在多任务操作系统中,通过运行多个进程来并发地执行多个任务。由于每个线程都是一个能独立执行自身指令的不同控制流,因此一个包含多个线程的进程也能够实现进程内多任务的并发执行。 进程是一个内核级的实体,进程结构的所有成分都在内核空间中,一个用户程序不能直接访问这些数据。 进程的状态: 创建、准备、运行、阻塞、结束。 进程间的通信方式可以有: 文件 管道 socket 信号 信号量 共享内存 要让Python程序实现多进程(multiprocessing),必须先了解操作系统的相关知识。 在Unix/Linux操作系统提供了一个fork()函数,它非常特殊,调用一次,返回两次,因为操作系统将当前的进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回。 Python中的进程 os.fork() subprocess processing multiprocessing fork()函数 函数原型: Help on built-in function fork in module posix: fork(...) fork() -> pid Fork a child process.

python中多进程(multiprocessing)

匿名 (未验证) 提交于 2019-12-02 22:11:45
python中多进程(multiprocessing) 一、 multiprocessing中使用子进程概念 from multiprocessing import Process 可以通过Process来构造一个子进程 p = Process(target=fun,args=(args)) 再通过p.start()来启动子进程 再通过p.join()方法来使得子进程运行结束后再执行父进程 1 from multiprocessing import Process import os # 子进程要执行的代码 def run_proc(name): print 'Run child process %s (%s)...' % (name, os.getpid()) if __name__=='__main__': print 'Parent process %s.' % os.getpid() p = Process(target=run_proc, args=('test',)) print 'Process will start.' p.start() p.join() print 'Process end.' 1 1 <span style = "font-family: verdana, Arial, Helvetica, sans-serif; font-size:

我已经理解了并发和并行的区别

匿名 (未验证) 提交于 2019-12-02 21:56:30
先举例子来理解这2个概念的区别。 老师让两个同学去办公室谈话。如果这两同学(进程)是并列跨过办公室门(CPU)的,那么就是并行。如果同学A先进入,然后同学B再进入,但是在办公室外的路人甲(用户)看来,同学A和同学B同时都在办公室内,这是并发。 其实这个例子不合理,因为真正的并行是多核CPU下的概念,但上面这个简单的例子非常有助于理解。 如果举例要精确一点,那么大概是这样的:进办公室有两个门(两CPU),如果两同学分别从不同的门进入,不管先后性,两者互相独立,那么是并行;如果两同学不管以什么方式进入,在路人甲看来,他两同时都在办公室内,就是并发。 我不信到现在还不理解并发和并行。 为什么操作系统上可以同时运行多个程序而用户感觉不出来? 这是因为无论是单CPU还是多CPU,操作系统都营造出了可以同时运行多个程序的 假象 。实际的过程操作系统对进程的调度以及CPU的快速上下文切换实现的: 每个进程执行一会就先停下来,然后CPU切换到下个被操作系统调度到的进程上使之运行 。因为切换的很快,使得用户认为操作系统一直在服务自己的程序。 再来解释并发就容易理解多了。 并发(concurrent)指的是多个程序可以同时运行的现象,更细化的是多进程可以同时运行或者多指令可以同时运行。但这不是重点,在描述并发的时候也不会去扣这种字眼是否精确,并发的重点在于它是一种现象。并发描述的是多进程同时运行的现象