python多线程

究竟什么是异步编程?

三世轮回 提交于 2019-12-25 18:54:39
  在我们的工作和学习当中,到处充满了异步的身影,到底什么是异步,什么是异步编程,为什么要用异步编程,以及经典的异步编程有哪些,在工作中的场景又有什么,我们一点点深入的去学习。   什么是异步编程?   有必要了解一下,什么是异步编程,为什么要异步编程。   先说一个概念异步与同步。介绍异步之前,回顾一下,所谓同步编程,就是计算机一行一行按顺序依次执行代码,当前代码任务耗时执行会阻塞后续代码的执行。   同步编程,即是一种典型的请求-响应模型,当请求调用一个函数或方法后,需等待其响应返回,然后执行后续代码。   一般情况下,同步编程,代码按序依次执行,能很好的保证程序的执行,但是在某些场景下,比如读取文件内容,或请求服务器接口数据,需要根据返回的数据内容执行后续操作,读取文件和请求接口直到数据返回这一过程是需要时间的,网络越差,耗费时间越长。   如果按照同步编程方式实现,在等待数据返回这段时间,JavaScript是不能处理其他任务的,此时页面的交互,滚动等任何操作也都会被阻塞,这显然是及其不友好,不可接受的,而这正是需要异步编程大显身手的场景。   我们想通过Ajax请求数据来渲染页面,这是一个在我们前端当中很常见渲染页面的方式。基本每个页面都会都这样的过程。在这里用同步的方式请求页面会怎么样?浏览器锁死,不能进行其他操作。而且每当发送新的请求,浏览器都会锁死,用户体验极差。

进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

二次信任 提交于 2019-12-25 04:33:02
在我之前的一篇博文中详细介绍了Python多线程的应用: 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼 但是由于GIL的存在,使得python多线程没有充分利用CPU的多核,为了利用多核,我可以采用多进程; 1. 父进程与子进程 wiki上对于父进程与子进程的定义: a)Parent process In Unix-like operating systems , every process except process 0 (the swapper) is created when another process executes the fork() system call . The process that invoked fork is the parent process and the newly created process is the child process . Every process (except process 0) has one parent process, but can have many child processes. In the Linux kernel , in which there is a very slim difference between processes and POSIX

python爬虫---多线程爬取腾讯招聘信息【简单版】

∥☆過路亽.° 提交于 2019-12-24 13:31:11
多线程快速爬取腾讯招聘数据 import time from selenium import webdriver from selenium . webdriver . support . wait import WebDriverWait from selenium . webdriver . support import expected_conditions as EC from selenium . webdriver . common . by import By import os import threading def save_to_html ( html_str , filename ) : dirname = os . path . dirname ( filename ) if not os . path . exists ( dirname ) : os . mkdir ( dirname ) with open ( filename , 'w' , encoding = 'utf-8' ) as fp : fp . write ( html_str ) print ( '下载完成!' , filename ) def get_content_by_selenium ( url ) : driver = webdriver . PhantomJS ( )

多线程、事件驱动与推荐引擎框架选型

末鹿安然 提交于 2019-12-23 22:42:07
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>   事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。多线程是另一种常用编程范式,并且更容易理解。   高性能通用型C++网络框架 Nebula 是基于事件驱动的多进程网络框架(适用于即时通讯、数据采集、实时计算、消息推送等应用场景),已有即时通讯、埋点数据采集及实时分析的生产应用案例。经常有人问Nebula的每个进程里是单线程还是多线程的?又问为什么不用多线程?不用多线程又怎么处理并发问题?   最近 Nebula 将会用于一个新的生产项目——推荐引擎,在此之前团队已有使用某知名度较高的RPC框架多线程版推荐引擎(业界许多推荐引擎都用了目前比较知名的开源RPC框架来开发)。本文不做Nebula与各知名RPC框架的比较,也无意说明哪个框架更适合做推荐引擎,只说明Nebula可以用于推荐引擎,且有信心效果会很好。最终结果如何,等推荐引擎研发出来,拭目以待。   为什么是事件驱动而不是多线程?事件驱动无须多线程。我们先来回顾一下服务器编程范式。 1. 服务器程序设计范式   《UNIX网络编程》卷一里介绍了9种服务器设计范式:   九种服务器设计范式并不是全都有实用价值,在《UNIX网络编程

面试必问题目“进程、线程对比”,包你会

百般思念 提交于 2019-12-23 15:53:24
简要说明 烟雨红尘小说网 https://wap.zuxs.net/ 在C语言、C++等方向面试时,经常会被问道 进程、线程等问题,当然了10年前我刚开始找工作那会,也是各种煎熬“我又不写操作系统,为什么还要学这么底层的知识”,真想不通面试官是不是sha。。。 转眼间,我现在成了面试官,你说可笑不。。。。世事变化无常啊。。。。 为了让各位小伙伴把这块理解了,所以趁一个空闲时机把它们的对比简单整理了下 我用了通俗易懂的方式来进行描述,希望各位小伙伴能够看完哦 😃 抖擞抖擞精神。。。开始吧。。。 1. 通俗理解进程、线程 进程,能够完成多任务,比如 在一台电脑上能够同时运行多个QQ 线程,能够完成多任务,比如 一个QQ中的多个聊天窗口 1.1 定义的不同 进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体, 是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 1.2 区别 一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高。 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率 线线程不能够独立执行

python 全局解释锁GIL

折月煮酒 提交于 2019-12-23 08:42:46
Python的全局解释器锁GIL用于保护python解释器,使得任意时刻,只有一个线程在解释器中运行。从而保证线程安全 在多线程环境中,Python 虚拟机按以下方式执行: 1. 设置GIL 2. 切换到一个线程去运行 3. 运行: a. 指定数量的字节码指令,或者 b. 线程主动让出控制(可以调用time.sleep(0)) 4. 把线程设置为睡眠状态 5. 解锁GIL 6. 再次重复以上所有步骤 由上可知,至少有两种情况python会解锁GIL,做线程切换:一是一但有IO操作时;线程连续执行了一定数量的指令时;当然此处的线程切换不一定就一定会切换到其他线程执行,因为如果当前线程 优先级比较高的话,可能在让出锁以后,又继续获得锁,并优先执行。 由此可以看到,Python多线程是单cpu意义上的多线程,它和多cpu上的多线程有着本质的区别。GIL会影响到那些严重依赖CPU的程序(比如计算型的),即使Python的多线程程序并不能利用多核CPU的优势; 但是如果程序大部分只会设计到I/O,比如网络交互,那么使用多线程就很合适, 因为它们大部分时间都在等待。 来源: https://www.cnblogs.com/yoyo008/p/9366088.html

进程与线程

坚强是说给别人听的谎言 提交于 2019-12-23 07:10:05
1、进程 进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。 要以一个整体的形式暴露给操作系统管理,里面包含了对各种资源的调用,内存的管理,网络接口的调用等;对各种资源的管理集合,就可以称为进程 1.1 multiprocessing模块( 多进程 ) from multiprocessing import Process import time def work(name): print('task <%s> is runing' %name) time.sleep(2) print('task <%s> is done' % name) if __name__ == '__main__': # Process(target=work,kwargs={'name':'jun'}) p1=Process(target=work,args=('jun',)) p2=Process(target=work,args=('xun',)) p1.start() p2.start() print('主') 1.2 join join等待线程执行完后,其他线程再继续执行(串行) from multiprocessing import Process import time def work(name): print('task <%s> is runing' %name)

python 之 线程,进程,协程

泪湿孤枕 提交于 2019-12-23 07:09:16
python 线程: Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。 1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 import threading 4 import time 5 6 def show(arg): 7 time.sleep(1) 8 print('threading' + str(arg)) 9 10 for i in range(10): 11 t = threading.Thread(target=show, args=(i,)) 12 t.start() 13 14 print ('main thread stop!') 上述代码创建了10个“前台”线程,然后控制器就交给了CPU,CPU根据指定算法进行调度,分片执行指令。 更多方法: start 线程准备就绪,等待CPU调度。 setName 为线程设置名称。 getName 获取线程名称。 setDaemon 设置为后台线程或前台线程(默认)。           如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止。           如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后等待前台线程也执行完成后,程序停止。 join 逐个执行每个线程

Python-线程、进程、协程

倖福魔咒の 提交于 2019-12-23 07:08:55
Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import threading 4 import time 5 6 def show(arg): 7 time.sleep(1) 8 print 'thread'+str(arg) 9 10 for i in range(10): 11 t = threading.Thread(target=show, args=(i,)) 12 t.start() 13 14 print 'main thread stop' 上述代码创建了10个“前台”线程,然后控制器就交给了CPU,CPU根据指定算法进行调度,分片执行指令。 更多方法: start 线程准备就绪,等待CPU调度 setName 为线程设置名称 getName 获取线程名称 setDaemon 设置为后台线程或前台线程(默认) 如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止 如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止 join 逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义 run

Python线程,进程

会有一股神秘感。 提交于 2019-12-23 07:08:24
线程,进程:线程是操作系统能够进行运算调度的最小单位。 一个线程就是一堆指令集合 GIL:(Global Interpreter Lock 全局解释器锁)只有cpython有GIL。 作用:在同一时刻只能有一个线程进入解释器,因为有GIL的存在,所以Python不能使用多个处理器同时处理多个线程。 GIL是加在解释器上的。 进程:一个程序的实例,可以多进程处理 线程可以数据共享,进程不能实现共享 结论:在Python里如果处理的任务是IO密集型的,可以用多线程,如果是计算密集型的,改C。 join是阻塞用的,在子线程完成运行之前,这个子线程的父线程将一直被阻塞。 daemon守护线程(主线程结束之后不再等待子线程运行,直接结束) #线程就是一堆指令集import timeimport threadingbegin=time.time()def foo(n): print('foo%s'%n) time.sleep(1) #不占CPU print('end foo')def bar(n): print('bar%s'%n) time.sleep(2) print('end bar')# foo()# bar()t1=threading.Thread(target=foo,args=(1,))t2=threading.Thread(target=bar,args=(2,))t1