python多线程

python爬虫 --多线程【晋级版】--阻塞--队列--公共缓冲区

混江龙づ霸主 提交于 2020-01-28 08:11:50
阻塞 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 from queue import Queue class Tencent ( threading . Thread ) : def __init__ ( self , q , name ) : super ( ) . __init__ ( ) self . q = q self . name = name # self.page = page def save_to_html ( self , html_str , filename ) : dirname = os . path . dirname ( filename ) if not os . path . exists ( dirname ) : os . mkdir ( dirname ) with open (

进程,线程和协程 并行与并发

谁说我不能喝 提交于 2020-01-28 02:56:57
一、进程 进程的出现是为了更好的利用CPU资源使到并发成为可能。 假设有两个任务A和B,当A遇到IO操作,CPU默默的等待任务A读取完操作再去执行任务B,这样无疑是对CPU资源的极大的浪费。聪明的老大们就在想若在任务A读取数据时,让任务B执行,当任务A读取完数据后,再切换到任务A执行。注意关键字切换,自然是切换,那么这就涉及到了状态的保存,状态的恢复,加上任务A与任务B所需要的系统资源(内存,硬盘,键盘等等)是不一样的。自然而然的就需要有一个东西去记录任务A和任务B分别需要什么资源,怎样去识别任务A和任务B等等。登登登,进程就被发明出来了。通过进程来分配系统资源,标识任务。如何分配CPU去执行进程称之为调度,进程状态的记录,恢复,切换称之为上下文切换。进程是系统资源分配的最小单位,进程占用的资源有: 地址空间 全局变量 文件描述符 各种硬件资源 相比线程和协程,进程是比较重量级的,它需要的资源很多。进程之间不共享内存变量,所以进程间的通信方式也多种多样: TCP REDIS等数据库 管道,文件等 二、线程 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使得进程内并发成为可能。假设,一个文本程序,需要接受键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。若只有一个进程,势必造成同一时间只能干一样事的尴尬(当保存时,就不能通过键盘输入内容

python多线程中锁的概念

主宰稳场 提交于 2020-01-27 22:25:19
python的锁可以独立提取出来 mutex = threading.Lock() #锁的使用 #创建锁 mutex = threading.Lock() #锁定 mutex.acquire([timeout]) #释放 mutex.release() 概念 好几个人问我给资源加锁是怎么回事,其实并不是给资源加锁, 而是用锁去锁定资源,你可以定义多个锁, 像下面的代码, 当你需要独占某一资源时,任何一个锁都可以锁这个资源 就好比你用不同的锁都可以把相同的一个门锁住是一个道理 import threading import time counter = 0 counter_lock = threading.Lock() #只是定义一个锁,并不是给资源加锁,你可以定义多个锁,像下两行代码,当你需要占用这个资源时,任何一个锁都可以锁这个资源 counter_lock2 = threading.Lock() counter_lock3 = threading.Lock() #可以使用上边三个锁的任何一个来锁定资源 class MyThread(threading.Thread):#使用类定义thread,继承threading.Thread def __init__(self,name): threading.Thread.__init__(self) self.name =

DAY9-python并发之多线程

有些话、适合烂在心里 提交于 2020-01-27 17:18:00
一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3/library/threading.html?highlight=threading# 二 开启线程的两种方式 #方式一 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=('egon',)) t.start() print('主线程') 方式一 方式一 #方式二 from threading import Thread import time class Sayhi(Thread): def __init__(self,name): super().__init__() self.name=name def run(self): time.sleep(2) print('%s say hello' % self.name) if __name__ == '__main__': t = Sayhi('egon') t

进程 线程

筅森魡賤 提交于 2020-01-27 05:25:26
一.关于线程和进程的说明   python本身没有进程和线程,python中调用了操作系统的线程和进程.   一个应用程序(软件),可以有多个进程(默认只有一个),一个进程中可以创建多个线程(默认一个).      创建进程是为了提供环境让线程工作,进程和进程之间做数据隔离(java/c#)   创建线程是因为线程是cpu工作的最小单元,创建线程可以利用多核优势实现并行操作(java/c#)   而python中存在一个GIL锁造成多线程无法利用多核优势,只能开多进程处理(浪费资源)   查看GIL切换的指令(sys.getcheckinterval)   Python语言的创始人在开发这门语言时,目的是快速把语言开发出来,如果加上GIL锁(C语言加锁),切换时按照100条字节指令来进行线程间的切换。    二. python进程,线程和java,c#的区别   python多线程情况下:        计算密集型操作:效率低(GIL锁)        IO操作:效率高   python多进程的情况下:        计算密集型操作:效率高(浪费资源)不得已而为之.        IO操作:效率高(浪费资源)   写python时IO密集型用多线程,计算密集型用多进程      java,c#多线程情况下:        计算密集型操作:效率高        IO操作:效率高  

进程和线程相关

…衆ロ難τιáo~ 提交于 2020-01-26 10:24:47
一、操作系统/应用程序 1、硬件 硬件包括硬盘、cpu、主板、显卡、内存、电源........ 2、系统 系统就是由程序员写出来的软件,该软件用于控制计算机的硬件,让他们相互配合工作 3、安装软件(安装应用程序) 二、线程和进程 应用程序调用操作系统的线程和进程 单进程、多线程的应用程序 1 import threading 2 print('666') 3 4 def func(arg): 5 print(arg) 6 t = threading.Thread(target=func) #创建线程 7 t.start() 8 9 print('end') #主线程 一个应用程序(软件),可以有多个进程(默认只有一个),一个进程中可以创建多个线程(默认只有一个) 操作系统帮助开发者操作硬件 python在多线程和多进程的情况 1、多线程情况下   计算机密集型操作:效率低。(GIL锁)   IO操作:效率高 2、多进程的情况下   计算机密集型:效率高(浪费资源,不得已而为之)   IO操作:效率高 对于python进程和线程的选择:   计算机密集型:多进程   IO操作:多线程 3、GIL锁:是全局解释器锁。用于限制一个进程中同一个时刻只有一个线程被CPU处理     扩展:默认GIL锁在执行100个CPU指令(过期时间) 1 import sys 2 v1=sys

Python多线程TCP通讯

泄露秘密 提交于 2020-01-26 04:36:41
import threading import socket encoding = ‘utf-8’ BUFSIZE = 1024 a read thread, read data from remote class Reader(threading.Thread): def init (self, client): threading.Thread. init (self) self.client = client def run(self): while True: data = self.client.recv(BUFSIZE) if (data): string = bytes.decode(data, encoding) print(string, end='') else: break print("close:", self.client.getpeername()) def readline(self): rec = self.inputs.readline() if rec: string = bytes.decode(rec, encoding) if len(string) > 2: string = string[0:-2] else: string = ' ' else: string = False return string a listen

python2.7入门---多线程

此生再无相见时 提交于 2020-01-24 07:43:21
多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 程序的运行速度可能加快 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。 线程可以被抢占(中断)。 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。 Python中使用线程有两种方式:函数或者用类来包装线程对象。首先是,函数式:调用thread模块中的start_new_thread()函数来产生新线程。语法如下: thread.start_new_thread ( function, args[, kwargs] )

Python3基础知识 | 多线程

让人想犯罪 __ 提交于 2020-01-23 00:34:02
Python3 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 程序的运行速度可能加快 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。 指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。 线程可以被抢占(中断)。 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) – 这就是线程的退让。 线程可以分为: 内核线程:由操作系统内核创建和撤销。 用户线程:不需要内核支持而在用户程序中实现的线程。 Python3 线程中常用的两个模块为: _thread threading(推荐使用) thread 模块已被废弃。用户可以使用 threading

python中的全局解释器锁GIL

二次信任 提交于 2020-01-22 18:25:02
全局解释器锁并不是由python语言标准规定,而是由CPython解释器实现的 产生原因: python的内存管理使用了引用计数的方法,而多线程同时操作一个变量时,引用计数可能出错导致内存泄露或者异常销毁,一个解决办法当然是加锁,但是python并没有采用,一个是频繁的加锁解锁影响性能,二是多个锁处理不好的话存在死锁的隐患,python干脆搞了一个全局的锁,GIL,任何python线程在执行之前必须获得这把唯一的解释器锁,避免了频繁加解锁和死锁。 同时也带来了问题,就是多线程无法真正利用多核。 刚才说道的是内存管理的线程安全,另外多线程间数据一致性也是问题,总之gil是为了解释器实现层面的线程安全,是当初的设计层面决定,很多人都认为这是一个烂设计,是一个历史遗留包袱。 1.python中的线程是不是操作系统内核线程,pthread? 答案是肯定的。python中的线程就是对操作系统内核线程的封装或者说是映射。一一对应。因此,python线程也是由操作系统内核进行调度的。进行调度的时机也是由操作系统来决定。 2.如果线程被操作系统调度,得到了CPU时间片,就一定会真正得到执行吗? 答案是否定的。 在解释器内部,涉及到线程执行的代码类似下面: while True r=gil.require() if r: code_line_counter=0 for code in thread