python多线程

Python之多线程爬虫抓取网页图片的示例代码

别说谁变了你拦得住时间么 提交于 2020-03-26 11:14:01
本篇文章主要介绍了Python之多线程爬虫抓取网页图片的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 目标 嗯,我们知道搜索或浏览网站时会有很多精美、漂亮的图片。 我们下载的时候,得鼠标一个个下载,而且还翻页。 那么,有没有一种方法,可以使用非人工方式自动识别并下载图片。美美哒。 那么请使用python语言,构建一个抓取和下载网页图片的爬虫。 当然为了提高效率,我们同时采用多线程并行方式。 思路分析 Python有很多的第三方库,可以帮助我们实现各种各样的功能。问题在于,我们弄清楚我们需要什么: 1)http请求库,根据网站地址可以获取网页源代码。甚至可以下载图片写入磁盘。 2)解析网页源代码,识别图片连接地址。比如正则表达式,或者简易的第三方库。 3)支持构建多线程或线程池。 4)如果可能,需要伪造成浏览器,或绕过网站校验。(嗯,网站有可能会防着爬虫 😉) 5)如果可能,也需要自动创建目录,随机数、日期时间等相关内容。 如此,我们开始搞事情。O(∩_∩)O~ 环境配置 操作系统:windows 或 linux 皆可 Python版本:Python3.6 ( not Python 2.x 哦) 第三方库 urllib.request threading 或者 concurrent.futures 多线程或线程池(python3.2+) re

python GIL

拜拜、爱过 提交于 2020-03-25 12:22:38
Python并不支持真正意义上的多线程。Python中提供了多线程包,但是如果你想通过多线程提高代码的速度,使用多线程包并不是个好主意。 Python中有一个被称为Global Interpreter Lock(GIL)的东西,它会确保任何时候你的多个线程中,只有一个被执行。 线程的执行速度非常之快,会让你误以为线程是并行执行的,但是实际上都是轮流执行。经过GIL这一道关卡处理,会增加执行的开销。 这意味着,如果你想提高代码的运行速度,使用threading包并不是一个很好的方法。 不过还是有很多理由促使我们使用threading包的。如果你想同时执行一些任务,而且不考虑效率问题,那么使用这个包是完全没问题的,而且也很方便。 但是大部分情况下,并不是这么一回事,你会希望把多线程的部分外包给操作系统完成(通过开启多个进程),或者是某些调用你的Python代码的外部程序(例如Spark或Hadoop),又或者是你的Python代码调用的其他代码(例如,你可以在Python中调用C函数,用于处理开销较大的多线程工作)。 本文首发于 python黑洞网 ,博客园同步更新 来源: https://www.cnblogs.com/pythonzhilian/p/12564974.html

python多线程完成模拟支付请求

本秂侑毒 提交于 2020-03-25 09:27:50
import asyncioimport sysfrom queue import Queuesys.path.append("../")from tool.__init__ import *from tool.decorator_token import *import timefrom threading import Thread,Lockclass doWeChatNotify(BaseTest): def __init__(self): super().__init__() self.limit_num=100 #查询记录条数 self.WeChatNotify_sql='''select order_id,order_sn from fw_order where `status`=0 and course_id=1569 ORDER BY create_time desc limit %d ;'''%(self.limit_num) self.fwh_test_api=fwh_test_api self.data = self.my_op.sql_operation_fwh(self.WeChatNotify_sql) self.fwh_order_dict = {} self.que = Queue() @token_fwh#验证token有效性 def get

《Python标准库》 目录

末鹿安然 提交于 2020-03-25 05:46:41
目录 译者序 序 前言 第1章 文本 1.1 string—文本常量和模板 1.1.1 函数 1.1.2 模板 1.1.3 高级模板 1.2 textwrap—格式化文本段落 1.2.1 示例数据 1.2.2 填充段落 1.2.3 去除现有缩进 1.2.4 结合dedent和fill 1.2.5 悬挂缩进 1.3 re—正则表达式 1.3.1 查找文本中的模式 1.3.2 编译表达式 1.3.3 多重匹配 1.3.4 模式语法 1.3.5 限制搜索 1.3.6 用组解析匹配 1.3.7 搜索选项 1.3.8 前向或后向 1.3.9 自引用表达式 1.3.10 用模式修改字符串 1.3.11 利用模式拆分 1.4 difflib—比较序列 1.4.1 比较文本体 1.4.2 无用数据 1.4.3 比较任意类型 第2章 数据结构 2.1 collections—容器数据类型 2.1.1 Counter 2.1.2 defaultdict 2.1.3 deque 2.1.4 namedtuple 2.1.5 OrderedDict 2.2 array—固定类型数据序列 2.2.1 初始化 2.2.2 处理数组 2.2.3 数组与文件 2.2.4 候选字节顺序 2.3 heapq—堆排序算法 2.3.1 示例数据 2.3.2 创建堆 2.3.3 访问堆的内容 2.3.4 堆的数据极值 2

线程锁是怎么回事?

时间秒杀一切 提交于 2020-03-24 07:38:59
内容衔接:   咱们要明白一件事就是我们现在在这里讲的锁跟前面所说的GIL锁不是一个锁,前面说的GIL锁 是Python内置的一个全局解释器,这个锁的目的就是保证在同一时刻进程中只有一个线程可以被CPU 调度.   但是我们也说了这个GIL锁有的时候并不能更快解决我们把语言翻译出来的目的,那比如说在密集 型计算问题的时候,反而会比较慢,那有的人就说了,那为什么不把这锁给去了?   这个问题我其实也一直在纠结,存在即合理,那么站在可观的角度去看这个问题,应该能给你解答 那么在Python开始被程序员使用的时候也有的就提出了这样的文问题,那么Python 的创始人的团队 也就在处理这个问题,但是当他们按照Java和C#的解决方案去解决这个问题的时候就发现,没有GIL锁 反而比有GIL锁跑的更慢了.所以有改回来了,但是一方面的原因还是因为他们团队代码写的不够好(个人 主见仅供参考)这一直以来成为了Python的一大诟病,但是我相信在Pyhton如此之火的现在而言解决 这个问题就是迟早的事情   扯了这么多,连主题都忘了继续说到我们今天要说的锁的事那么我们今天要说的锁2到底是什么呢> 给你就一个例子,就是说这样一个 场景,比如说我现在有有两个函数;里面都要去调用公共变量的一个 值但是我们运行的时候由于这个GIL锁的原因,我第一个程序还没有将公共变量中值改好但是我的使用 次数已经够了

python 协程

删除回忆录丶 提交于 2020-03-23 19:13:29
协程之前我们明白Python的进程和线程,这里我们来说一下协程 子程序切换不是线程切换,而是由程序自身控制 没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显 不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁 协程实现 def custumer(): r = '' while True: n = yield r # 接受send的值 返出yield的值 if not n: return print('custer {}'.format(n)) r = 'done' def produce(c): c.send(None) # 启动 n = 0 while n < 5: n += 1 print('custer {}'.format(n)) r = c.send(n) print('custer return {}'.format(r)) c.close() c = custumer() produce(c) 本文首发于 python黑洞网 ,博客园同步更新 来源: https://www.cnblogs.com/pythonzhilian/p/12553890.html

线程以及线程模块中的其他方法(一)

人走茶凉 提交于 2020-03-23 06:21:02
线程就栈寄存那些东西,占用内存小 内存数据的共享问题import osimport timefrom threading import Thread# 多线程并发# def func(a,b):# global g# g = 0# print(g,os.getpid())## g = 100# t_lst = []# for i in range(10):# t = Thread(target=func,args=(i,5))# t.start()# t_lst.append(t)# for t in t_lst : t.join()# print(g) # class MyTread(Thread):# def __init__(self,arg): #重写_init_方法# super().__init__()# self.arg = arg# def run(self): #必须定义run# time.sleep(1)# print(self.arg)## t = MyTread(10)# t.start()# 进程 是 最小的 内存分配单位# 线程 是 操作系统调度的最小单位# 线程直接被CPU执行,进程内至少含有一个线程,也可以开启多个线程 # 开启一个线程所需要的时间要远远小于开启一个进程 # 多个线程内部有自己的数据栈,数据不共享 #

进程和线程的区别

Deadly 提交于 2020-03-22 18:14:38
进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。 线程是程序执行时的最小单位,它是进程的一个执行流。 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵 线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多 进程实现 from multiprocessing import Pool import time import random import os def work(msg): start = time.time() print("work{}开始执行,id为{}".format(msg, os.getpid())) time.sleep(random.random()*2) stop = time.time() print("work{}耗时{}.".format(msg, stop-start)) p = Pool() for i in range(10): # 非堵塞运行 p.apply_async(work, args=(i,)) # 堵塞进行 # p.apply(work, args=(i,)) print("开始") p.close() p.join() print("结束") 线程实现

GIL全局解释器锁

我只是一个虾纸丫 提交于 2020-03-22 05:11:00
GIL介绍 GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全 如果多个线程的target=work,那么执行流程是: 多个线程先访问到解释器的代码,即拿到执行权限,然后将target的代码交给解释器的代码去执行 解释器的代码是所有线程共享的,所以垃圾回收线程也可能访问到解释器的代码而去执行,这就导致了一个问题:对于同一个数据100,可能线程1执行x=100的同时,而垃圾回收执行的是回收100的操作,解决这种问题没有什么高明的方法,就是加锁处理,如下图的GIL,保证python解释器同一时间只能执行一个任务的代码 GIL与Lock GIL 与Lock是两把锁,保护的数据不一样,前者是解释器级别的(当然保护的就是解释器级别的数据,比如垃圾回收的数据),后者是保护用户自己开发的应用程序的数据,很明显GIL不负责这件事,只能用户自定义加锁处理,即Lock,如下图 分析: 1、100个线程去抢GIL锁,即抢执行权限 2、肯定有一个线程先抢到GIL(暂且称为线程1),然后开始执行,一旦执行就会拿到lock.acquire() 3、极有可能线程1还未运行完毕,就有另外一个线程2抢到GIL,然后开始运行,但线程2发现互斥锁lock还未被线程1释放,于是阻塞,被迫交出执行权限,即释放GIL 4

python队列基本使用

半世苍凉 提交于 2020-03-21 19:59:28
Python queue队列 作用:    解耦:使程序直接实现松耦合,修改一个函数,不会有串联关系。    提高处理效率:FIFO = 现进先出,LIFO = 后入先出。 队列:   队列可以并发的派多个线程,对排列的线程处理,并切每个需要处理线程只需要将请求的数据放入队列容器的内存中,线程不需要等待,当排列完毕处理完数据后,线程在准时来取数据即可。请求数据的线程只与这个队列容器存在关系,处理数据的线程down掉不会影响到请求数据的线程,队列会派给其他线程处理这分数据,它实现了解耦,提高效率。队列内会有一个有顺序的容器,列表与这个容器是有区别的,列表中数据虽然是排列的,但数据被取走后还会保留,而队列中这个容器的数据被取后将不会保留。当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用。 Python四种类型的队例: Queue:FIFO 即first in first out 先进先出 LifoQueue:LIFO 即last in first out 后进先出 PriorityQueue:优先队列,级别越低,越优先deque:双边队列 导入三种队列,包 from queue import Queue,LifoQueue,PriorityQueue Queue 先进先出队列: #基本FIFO队列 先进先出 FIFO即First in First Out,先进先出