gevent

python并发编程之asyncio协程(三)

落花浮王杯 提交于 2020-11-18 05:00:10
协程实现了在单线程下的并发,每个协程共享线程的几乎所有的资源,除了协程自己私有的上下文栈;协程的切换属于程序级别的切换,对于操作系统来说是无感知的,因此切换速度更快、开销更小、效率更高,在有多IO操作的业务中能极大提高效率。 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asyncio协程(三) python并发编程之gevent协程(四) python并发编程之Queue线程、进程、协程通信(五) python并发编程之进程、线程、协程的调度原理(六) asyncio模块创建协程 asyncio在python3.4后被内置在python中,使得python的协程创建变得更加方便。 import asyncio import os # async 关键字定义一个协程 async def target_func1(): print('the func start') print(os.getpid()) print('the func end') def run(): # 创建一个协程对象 coroutine = target_func1() # 创建一个事件循环 loop = asyncio.get_event_loop() loop.run_until_complete

django 重写 mysql 连接库实现连接池

…衆ロ難τιáo~ 提交于 2020-11-02 06:44:54
django 重写 mysql 连接库实现连接池 问题 django 项目使用 gunicorn + gevent 部署,并设置 CONN_MAX_AGE 会导致 mysql 数据库连接数飙升,在高并发模式可能会出现 too many connections 错误。该怎么解决这个问题呢?首先看下 django 源码,找到问题的根源。 本文 django 版本为 2.2.3。 问题分析 首先查看连接部分源码: # django/db/backends/mysql/base.py class DatabaseWrapper(BaseDatabaseWrapper): vendor = 'mysql' ... ... ... def get_new_connection(self, conn_params): # 每次查询都会重新建立连接 return Database.connect(**conn_params) ... ... ... 再查看其基类 BaseDatabaseWrapper # django/db/backends/base/base.py class BaseDatabaseWrapper: """Represent a database connection.""" # Mapping of Field objects to their column types.

python网络编程(进程与多线程)

梦想的初衷 提交于 2020-08-17 00:00:14
multiprocessing模块   由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。   multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。   此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。   multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。   Process类的介绍 Process(target = talk,args = (conn,addr)) #

Python—进程、线程、协程

徘徊边缘 提交于 2020-08-15 22:51:06
一、线程   线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 方法:   start 线程准备就绪,等待CPU调度   setName 设置线程名称   getName 获取线程名称   setDaemon 把一个主进程设置为Daemon线程后,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论有没执行完成,都会停止   join 逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义     run 线程被cpu调度后自动执行线程对象的run方法 threading模块   线程的两种调用方式: 1.直接调用(常用) import threading import time '''直接调用''' def hello(name): print("Hello %s"%name) time.sleep(3) if __name__ == "__main__": t1=threading.Thread(target=hello,args=("zhangsan",)) #生成线程实例 t2=threading.Thread(target=hello,args=("lisi",)) t1.setName("aaa")

Python error: execute cannot be used while an asynchronous query is underway

戏子无情 提交于 2020-07-20 08:32:31
问题 How do I prevent the error “ ProgrammingError: execute cannot be used while an asynchronous query is underway ”? From the docs it says that I should use psycopg2.extras.wait_select if I’m using a coroutine support like gevent., but I’m still get that error when I’m using it. I’ve isolated the error I’m getting in the snippet below. con = psycopg2.connect(database=DATABASE_NAME, user=DATABASE_USERNAME) def execute_query(cur, query, params): psycopg2.extras.wait_select(con) cur.execute(query,

Python基础之(并发编程)

安稳与你 提交于 2020-05-08 08:24:48
一、进程 1.1、什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是 操作系统 结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,而进程是程序的实体。 狭义定义:进程是正在运行的程序的实例 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是 操作系统 动态执行的 基本单元 ,在传统的 操作系统 中,进程既是基本的 分配单元 ,也是基本的执行单元 1.2、并发与并行 并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑;(资源够用,比如三个线程,四核的CPU ) 并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率(一种是伪并行,cpu多道技术IO切换;另一种就是并行,具备多个cpu) 1.3、同步、异步,阻塞、非阻塞 所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列 。要么成功都成功,失败都失败,两个任务的状态可以保持一致; 异步是指不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作

Python 异步编程再添一利器

扶醉桌前 提交于 2020-05-05 12:47:34
随着 Tornado 和 asyncio 等框架的陆续涌现,Python 异步编程这个话题也在逐渐升温。在这个烧脑的异步世界里,有没有办法可以既方便快捷、又简单明了地访问数据库呢?GitHub 千星项目 GINO 了解一下! 1. GINO 是谁 GINO 是一个“轻量级”异步 ORM 框架,它的全称是 GINO Is Not ORM,借鉴了 GNU is Not Unix 的递归定义手法。所以,GINO 一定要全!部!大!写!如果像这样“Gino”就变成了人名,你肯定要问一句“这是谁”。 ORM,即关系对象映射(Object-Relational Mapping),是一类开发人员喜闻乐见的效率工具,它们"极大地"提升了写代码的幸福指数。GINO 是用来访问数据库的,也提供了对象映射的工具,那为什么非说 GINO 不是 ORM 呢? 因为物极必反,ORM 在带来生活便利的同时,也是 bug 生长的温床 —— 传统 ORM 往往会选择牺牲明确性(explicitness)来换取便捷性(convenience),再加上 Python 得天独厚的灵活性(flexibility),创造出了一种爆炸式的化学反应。一旦代码初具规模,项目或多或少都会遇到 ORM 反噬的情景:性能莫名其妙的差、出问题找不到原因、为了鸡毛蒜皮的小事大动干戈。随便一句 current_user.name

Python爬虫【第3篇】【多线程】

陌路散爱 提交于 2020-05-04 08:00:20
一、多线程 Python标准库提供2个模块,thread是低级模块,threading是高级模块 1.threading模块创建多线程 方式1:把1个函数传入并创建Thread实例,然后调用start方法开始执行 import random import time,threading # 新线程执行的代码 def thread_run(urls): print ' Current %s is running... ' % threading.current_thread().name for url in urls: print ' %s ---->>> %s ' % (threading.current_thread().name,url) time.sleep(random.random()) print ' %s ended ' % threading.current_thread().name print ' %s is running... ' % threading.current_thread().name t1 = threading.Thread(target=thread_run,name= ' Thread_1 ' ,args=([ ' url_1 ' , ' url_2 ' , ' url_3 ' ],)) t2 = threading.Thread

Python并发编程二(多线程、协程、IO模型)

亡梦爱人 提交于 2020-05-04 07:02:50
1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于cpu),而一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一条流水线。 所以, 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。 多线程(即多个控制线程)的概念是, 在一个进程中存在多个线程,多个线程共享该进程的地址空间 ,相当于一个车间内有多条流水线,都共用一个车间的资源。例如,北京地铁与上海地铁是不同的进程,而北京地铁里的13号线是一个线程,北京地铁所有的线路共享北京地铁所有的资源,比如所有的乘客可以被所有线路拉。 1.2线程与进程的区别 Threads share the address space of the process that created it; processes have their own address space. Threads have direct access to the data segment of its process; processes have their own copy of the data