随笔分类 - Python
摘要:1.非阻塞IO 2.阻塞IO 3.IO多路复用 3.1 IO多路复用中的select 服务端 3.2 linux上更好的IO多路复用epoll、selectors选择当前系统最优的IO多路复用机制 服务端 客户端 4.信号驱动IO 5.异步IO 6.五种IO模型的比较,个人觉得肯定还是异步IO好
阅读全文
摘要:在python中多线程其实是被弱化了,因为由于GIL的原因,同一时间只有一个线程能访问CPU,即使你的CPU是多核的在python中因为多线程被弱化了,所以协程显的重要,能够在一个线程中提高CPU的利用率,一个线程中开启500个协程,4核CPU开启20个线程效率不错,4核CPU开启5个进程会比较不错
阅读全文
摘要:# 分别使用urlopen和requests两个模块进行演示 # import requests # 需要安装的 # from urllib.request import urlopen # # url = 'http://www.baidu.com' # # # res1 = urlopen(url) # urlopen,获取到页面请求对象 # res2 = requests.get(url)...
阅读全文
摘要:协程:能够在一个线程中实现并发效果的概念,能够巧妙的利用任务中的IO阻塞时间,在任务的执行过程中,检测到IO操作时就能够协程切换到别的任务中运行
阅读全文
摘要:# pip 装模块 greenlet和gevent # 协程 # 与进程、线程一样也是实现并发的手段 # 创建一个线程、关闭一个线程都需要创建寄存器、栈等、需要消耗时间 # 协程本质上是一个线程 # 能够在多个任务之间切换来节省一些IO时间 # 协程中任务之间的切换时间开销,要远远小于进程或线程之间的切换 # 4CPU中,进程一般创建4+1个进...
阅读全文
摘要:# concurrent.futures模块提供了高度封装的异步调用接口。 # 其中ThreadPoolExecutor:线程池,提供异步调用 # 其中ProcessPooExecutor:进程池,提供异步调用。之前学过multiprocessing中的Pool也是进程池。 # 在这个concurrent.futures模块中,线程池与进程池的所有方法接口都是相同的 # 基本方...
阅读全文
摘要:# 队列是数据安全的,意思是自带锁,多线程间通信时,使用队列是好的,不会出现同一个数据被多个线程抢占,使用其他数据类型进行通信则需要自己实现锁功能 import queue # 普通先进先出队列 # q = queue.Queue() # 没有参数则表示队列没有指定深度 # q.put(1) # 如果队列指定了深度则到了深度后,会阻塞在这里等待队列有空间后再向队列中放入数据 # q.pu...
阅读全文
摘要:# 线程中的信号量 # 和进程中的信号量概念一样,创建好信号量的深度后,同一时间只有n个线程可以访问被信号量保护的代码 # 同一时间只有4个线程可以访问被信号量保护的代码 # import time # from threading import Semaphore, Thread # # def func(sem, a, b): # sem.acquire() # ...
阅读全文
摘要:# 一般进程中,我们锁用的少,因为我们进程之间通信,很少会使用IPC中的管道、队列、Manager这些东西,而是使用一些中间件,而在这些中间件中,已经帮我们实现了进程之间锁的功能,访问消息中间件是不需要加锁的 # 线程锁 # Lock互斥锁会存在死锁问题,需要编码者注意 # RLock递归锁 # 互斥锁 # from threading import Lock # from ...
阅读全文
摘要:# 没有守护线程时,主线程会等待子线程的结束,子线程结束后,主线程才会结束 # import time # from threading import Thread # # # def func1(): # print(666) # time.sleep(10) # # def func2(): # pass # # if __name__ == '__main__':...
阅读全文
摘要:import threading def wahaha(n): print(n, threading.current_thread()) # 1 threading.Thread(target=wahaha, args=(1,)).start() print(threading.current_thread()) # # 查看线程名和线程id的方法, print(th...
阅读全文
摘要:# Cpyrhon解释器下有个全局解释器锁-GIL:在同一 # 在同一时刻,多线程中只有一个线程访问CPU # 有了全局解释器锁(GIL)后,在同一时刻只能有一个线程访问CPU。 # 全局解释器锁锁的是线程,而不是数据。 # 这种全局解释器锁的特性就是同一时间只有有一个线程访问CPU,所以在多个CPU的情况下,也只有一个线程在一个时间点访问CPU,这是Cpytho...
阅读全文
摘要:# python线程模块的选择 #python提供了几个用于多线程编程的模块,包括thread、threading和Queue等。 # thread和threading模块允许程序员创建和管理线程。 # thread模块提供了基本的线程和锁的而支持,threading提供了更高级别、功能更强的线程管理功能 # Queue模块允许用户创建一个...
阅读全文
摘要:# 使用进程池的进程爬取网页内容,使用回调函数处理数据,用到了正则表达式和re模块 import re from urllib.request import urlopen from multiprocessing import Pool def get_page(url,pattern): response=urlopen(url).read().decode('utf-8') ...
阅读全文
摘要:回调函数:一般应用在进程的任务有延时,而要处理的数据时间的很短时,将进程的任务和回调函数绑定起来,将任务获取到的数据返回给回调函数,由回调函数处理数据,回调函数是在主进程中得以执行的
阅读全文
摘要:1.使用requsets出现这个错误,ImportError: No module named 'chardet' 原因:requests依赖其他一些模块 解决:依次使用pip安装即可 pip install certifi pip install chardet pip install idna
阅读全文
摘要:1.cmd上运行pip后,出现这个 Fatal error in launcher: Unable to create process using '"' 原因:计算机的环境变量中找不到python,找不到pip。肯定是之前装过很多个python版本造成的。 解决:path环境变量中python.e
阅读全文
摘要:一般在爬虫中,用到回调函数比较多,并且是将访问网页、下载网页的过程放到子进程中去做,分析数据,处理数据让回调函数去做,因为访问网页与下载网页有网络延时,而处理数据只占用很小的时间
阅读全文