python多线程并发

【python基础】十八、Python process 进程

被刻印的时光 ゝ 提交于 2019-12-15 03:00:14
进程 线程 协程 并发: 一个cpu, 轮流交替进行多线程 并行: 多个cpu, 同时执行,或 同时并发执行 进程 > 线程 > 协程 > 生成器 都可以实现多任务: 与特点有关 任务比较多 用进程 爬虫 用线程 或 协程 进程(Process),操作系统结构的基础, 曾经,面向进程设计的计算机结构中,进程就是程序的基本执行实体.(一个c) 当代,面向线程设计的计算机结构中,进程是线程的容器 * 优点 * 缺点 linux下 使用 fork 函数创建进程 os模块的fork windows 使用 multiprocessing模块 多进程 能否 访问 同一个全局变量? 能, 仅仅 复制 全局变量 到自己进程, 不共用 耗时用 线程 - 下载 计算用 进程 - 运算 import os import time from multiprocessing import Process n = 5 # def download ( t ) : global n # 只是取到全局n的初始值, 不与task_2 共用 while True : n -= 1.8 print ( ' -- SonProcess Task 1' , os . getpid ( ) , '-' , os . getppid ( ) , 'n:' , n ) time . sleep ( t ) def getfile

Python控制多进程与多线程并发数总结

安稳与你 提交于 2019-12-14 00:59:16
一、前言 本来写了脚本用于暴力破解密码,可是1秒钟尝试一个密码2220000个密码我的天,想用多线程可是只会一个for全开,难道开2220000个线程吗?只好学习控制线程数了,官方文档不好看,觉得结构不够清晰,网上找很多文章也都不很清晰,只有for全开线程,没有控制线程数的具体说明,最终终于根据多篇文章和官方文档算是搞明白基础的多线程怎么实现法了,怕长时间不用又忘记,找着麻烦就贴这了,跟我一样新手也可以参照参照。 先说进程和线程的区别: 地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间; 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源 线程是处理器调度的基本单位,但进程不是. 二者均可并发执行. 不能理解的话简单打比方就是一个进程就像一个程序一样,并发互不干扰。一个进程靠一个或多个线程执行处理,并发的线程是cpu在不停的来回切换执行,当然是快到你感觉不出的。 拿上面我遇到的困难来说吧,大量的数据需要执行相同的处理,一个操作中间可能会有一些等待时间,一个一个执行浪费大量时间,那么就同时执行吧,我们可以用两种并行办法: 进程并行或者线程并行 各有优缺点,要看情况,不是绝对的,在此不讨论这个,这引出下面两种Python并行处理方法(注释感觉很清晰详细了,不再多说) 二、进程处理方法 #coding:utf-8

python测试开发(05-多线程和锁)

与世无争的帅哥 提交于 2019-12-12 21:41:11
1.线程的启动 import threading, timeimport requests# 通过继承Thread来创建线程class RequestThread(threading.Thread): '''发送requests请求''' # 传其他地址,必须调用父类URL def __init__(self, url): self.url=url super().__init__() def run(self): res=requests.get(url) print("线程:{}===返回状态码---{}".format(threading.current_thread(), res.status_code))# 创建5个线程,发起请求s_time=time.time()for i in range(5): t=RequestThread() t.start() time.sleep(3)t.join()e_time=time.time()print("耗时:",e_time-s_time)2.多个线程并发 a=100def func1(): global a for i in range(10): a+=1 print("1----->",a)def func2(): global a for i in range(10): a+=1 print("2----->",a)t1

python 进程与线程 精要

半世苍凉 提交于 2019-12-11 16:08:51
程序与进程 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。 程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。 进程是资源分配的最小单位,线程是CPU调度的最小单位, 每一个进程中至少有一个线程。 线程 线程是进程中执行运算的最小单位,是进程中的一个实体, 通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位。 1、在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位 2、同一进程中的各个线程,都可以共享该进程所拥有的资源 3、一个进程中的多个线程之间,可以并发执行 当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束, Python3 通过两个标准库 _thread 和 threading 提供对线程的支持。 _thread 提供了低级别的、原始的线程以及一个简单的锁,它相比于 threading 模块的功能还是比较有限的。 threading 模块除了包含 _thread 模块中的所有方法外

Python程序中的线程操作(oncurrent模块)

不羁岁月 提交于 2019-12-11 02:28:33
进程是cpu资源分配的最小单元,一个进程中可以有多个线程。 线程是cpu计算的最小单元。 对于Python来说他的进程和线程和其他语言有差异,是有GIL锁。 GIL锁 GIL锁保证一个进程中同一时刻只有一个线程被cpu调度。 GIL锁,全局解释器锁。用于限制一个进程中同一时刻只有一个线程被cpu调度。 扩展:默认GIL锁在执行100个cpu指令(过期时间)。 查看GIL切换的指令个数 import sys v1 = sys。getcheckinterval() print(v1) 一、通过threading.Thread类创建线程 1、 创建线程的方式:直接使用Thread from threading import Thread import time def sayhi(name): time.sleep(2) print('%s say hello' %name) if __name__ == '__main__': t = Thread(target=sayhi,args=( ' nick ' ,)) t.start() print('主线程') 2、 创建线程的方式:继承Thread from threading import Thread import time class Sayhi(Thread): def __init__(self,name): super().

为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快。

拥有回忆 提交于 2019-12-10 16:11:04
为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快。 一、python的多线程不能利用多核CPU? 原因: 因为GIL,python只有一个GIL,运行python时,就要拿到这个锁才能执行,在遇到I/O 操作时会释放这把锁。 如果是纯计算的程序,没有 I/O 操作,解释器会每隔100次操作就释放这把锁,让别的线程有机会 执行(这个次数可以通sys.setcheckinterval 来调整)同一时间只会有一个获得GIL线程在跑,其他线程都处于等待状态 1、如果是CPU密集型代码(循环、计算等),由于计算工作量多和大,计算很快就会达到100,然后触发GIL的释放与在竞争,多个线程来回切换损耗资源, 所以在多线程遇到CPU密集型代码时,单线程会比较快 2、如果是I\O密集型代码(文件处理、网络爬虫),开启多线程实际上是并发(不是并行),IO操作会进行IO等待,线程A等待时,自动切换到线程B, 这样就提升了效率 二、其他原理解释 转:链接:https://www.zhihu.com/question/23474039/answer/24695447 地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的多线程是有compromise的

python基础-并发编程02

筅森魡賤 提交于 2019-12-10 14:29:59
并发编程 子进程回收的两种方式 join() 让主进程等待子进程结束,并回收子进程资源,主进程再结束并回收资源 from multiprocessing import Process import time def task(name): print(f'子进程{name}:starting……') time.sleep(1) print(f'子进程{name}:end……') if __name__ == '__main__': print('进入主进程……') pro_list = [] for i in range(3): pro_obj = Process(target=task, args=(i,)) pro_list.append(pro_obj) pro_obj.start() for pro in pro_list: # 强制子进程结束后,主进程才可以结束,实现子进程资源回收 pro.join() print('结束主进程……') 主进程正常结束 ,子进程与主进程一并被回收资源 了解知识 僵尸进程: 子进程结束后,主进程没有正常结束 ,子进程PID不会被回收。 缺点:操作系统中的PID号是有限的,只用PID号也就是资源被占用,可能会导致无法创建新的进程 孤儿进程: 子进程未结束,主进程没有正常结束 ,子进程PID不会被回收,会被操作系统优化机制回收。

python并发编程知识点总结

耗尽温柔 提交于 2019-12-10 03:51:58
1.到底什么是线程?什么是进程? Python自己没有这玩意,Python中调用的操作系统的线程和进程. 2.Python多线程情况下: 计算密集型操作:效率低,Python内置的一个全局解释器锁,锁的作用就是保证同一时刻一个进程中只有一个线程可以被cpu调度,多线程无法利用多核优势,可以通过多进程方式解决,但是比较浪费资源. IO操作:效率高 3.Python多进程的情况下: 计算密集型操作:效率高(浪费资源),不得已而为之. IO操作:效率高(浪费资源) 4.为什么有这把GIL锁? Python语言的创始人在开发这门语言时,目的快速把语言开发出来,如果加上GIL锁(C语言加锁),切换时按照100条字节指令来进行线程间的切换. 5.Python中线程和进程(GIL锁) GIL锁,全局解释器锁.用于限制一个进程中同一时刻只有一个线程被cpu调度. 扩展:默认GIL锁在执行100个cpu指令(过期时间). 查看GIL切换的指令个数 import sys v1 = sys.getcheckinterval() print(v1) 6.为什么要创建线程? 由于线程是cpu工作的最小单元,创建线程可以利用多核优势实现并行操作(Java/C#). 注意:线程是为了工作. 7.为什么要创建进程? 进程和进程之间做数据隔离(Java/C#). 注意:进程是为了提供环境让线程工作. 8

python面试题3

一世执手 提交于 2019-12-09 23:02:35
如何做一个成功的python后端开发工程师 看到“如何面试Python后端工程师”这个问题下一位大牛罗列的问题,感觉挺有价值。现在记在这里,找出这些问题的答案,持续更新。 ################################################# 一 . 语言 1.推荐一本看过最好的python书籍? 拉开话题好扯淡 目前所知道的,看过的就是《Python 核心编程》(第二版),《Flask》 2.谈谈python的装饰器,迭代器,yield? 2.1 装饰器,这篇博文说的很细致,总的来说,装饰器是对函数的一种通用处理方法。 http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 2.2 迭代器,生成器 http://www.cnblogs.com/kaituorensheng/p/3826911.html 带有 yield 的函数在 Python 中被称之为 generator(生成器) xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器. 2.3 yield https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ 函数中有yield语句,这个函数就是一个

python 线程

你离开我真会死。 提交于 2019-12-09 22:08:36
从进程到线程 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。 程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。 在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行,大大提高了CPU的利用率。 进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的。 进程有很多优点,它提供了多道编程,每个进程都拥有自己的CPU和其他资源,可以提高计算机的利用率。为什么还要线程呢? 主要体现在两点上: 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。 60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端。 由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入 轻型进程 由于对称多处理机(SMP)出现, 可以满足多个运行单位 ,而多个进程并行开销过大 因此在80年代,出现了 能独立运行的基本单位 ——线程(Threads) 。 进程是资源分配的最小单位,线程是CPU调度的最小单位, 每一个进程中至少有一个线程。