python多线程

Django异步任务线程池

荒凉一梦 提交于 2019-12-16 19:56:30
当数据库数据量很大时(百万级),许多批量数据修改请求的响应会非常慢,一些不需要即时响应的任务可以放到后台的异步线程中完成,发起异步任务的请求就可以立即响应 选择用线程池的原因是:线程比进程更为可控。不像子进程,子线程会在所属进程结束时立即结束。线程可共享内存。 请求任务异步处理的原理 使用 python manage.py runserver 模式启动的Django应用只有一个进程,对于每个请求,主线程会开启一个子线程来处理请求。请求子线程向主线程申请一个新线程,然后把耗时的任务交给新线程,自身立即响应,这就是请求任务异步处理的原理。 可视化线程池 如果想要管理这批异步线程,知道他们是否在运行中,可以使用线程池(ThreadPoolExecutor)。 线程池会先启动若干数量的线程,并让这些线程都处于睡眠状态,当向线程池submit一个任务后,会唤醒线程池中的某一个睡眠线程,让它来处理这个任务,当处理完这个任务,线程又处于睡眠状态。 submit任务后会返回一个期程(future),这个对象可以查看线程池中执行此任务的线程是否仍在处理中 因此可以构建一个全局可视化线程池: from concurrent.futures.thread import ThreadPoolExecutor class ThreadPool(object): def __init__(self): #

python常用标准库

懵懂的女人 提交于 2019-12-16 17:35:30
-------------------系统内建函数------------------- 1、字符串 str='这是一个字符串数据测试数据'对应 str[0]:获取str字符串中下标为0的字符。 str[3]:获取str字符串中下标为3的字符。 str[0:3]:获取到字符串中从下标为0到下标为3的字符串。 str.find():返回指定str字符串中是否存在指定的字符串数据信息;如果存在则返回字符串首字母的下标,如果不存在则返回-1。 str.index():返回指定str字符串中是否存在指定的字符串数据信息;如果存在则返回字符串首字母的下标,如果不存在进行错误异常处理。 str.count():返回指定str字符串中被查找字符串存在的个数信息。 len(str):返回指定str字符串的字符总长度;如果字符串为空,则返回值为0。 str.replace('替换前字符','替换后字符',指定替换的次数):进行指定str字符串中指定字符数据的替换操作,并将替换后的数据进行返回。 str.split(" ",切割次数):进行指定字符串的切割,返回被切割后的字符串列表数据信息;如果切割次数不填,默认进行最大的切割次数。 str.capitalize():将指定str字符串的第一个字符进行大写。 str.startswith(匹配字符串数据):返回boolen类型

python,多线程应用示例

孤者浪人 提交于 2019-12-14 12:29:23
应用python的threading模块开启多线程执行程序,会缩短程序运行时间,下面代码演示了多线程应用 #不开启多线程演示 import time,threading def foo(n): print('foo%s'%n) time.sleep(1) def bar(n): print('bar%s'%n) time.sleep(2) begin = time.time() t1 = threading.Thread(target = foo,args = (1,)) t2 = threading.Thread(target = bar,args = (2,)) #t1.start() #t2.start() foo(1) bar(2) end = time.time() process_time = end - begin print('process time is:%s'%(str(process_time))) 上面不开启多线程的情况下执行结果如下: /usr/bin/python3.6 /home/guoming/python/day27/thread.py foo1 bar2 process time is:3.003460168838501 Process finished with exit code 0 程序运行花了3秒时间 #改写一下,开启两个线程

专题八.多线程编程之thread和threading

家住魔仙堡 提交于 2019-12-14 11:25:43
https://blog.csdn.net/Eastmount/article/details/50155353 有几个知识点是非常重要的,包括:面向对象的思想、如何架构一个项目、设计模式来具体解决问题、应用机器学习和深度学习的方法,当然也包括我这篇文章的内容——多线程和并行化处理数据。 这篇文章主要是参考Wesley J. Chun的《Python核心编程(第二版)》书籍多线程部分,并结合我以前的一些实例进行简单分析。尤其是在大数据、Hadoop\Spark、分布式开发流行的今天,这些基础同样很重要。希望对你有所帮助吧! PS:推荐大家阅读《Python核心编程》和《Python基础教程》两本书~ 强推: http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html 一. 线程和进程的概念 二. Python线程和全局解释器锁 三. thread模块 来源: https://www.cnblogs.com/chenhuan123/p/12038440.html

多线程(一)

▼魔方 西西 提交于 2019-12-12 23:25:14
什么是线程? ➢线程是一个进程的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程是由表示程序运行状态的寄存器(如程序计数器、栈指针)以及堆栈组成,它是比进程更小的单位。 ➢线程是程序中的一个执行流。一个执行流是由CPU运行程序代码并操作程序的数据所形成的。因此,线程被认为是以CPU为主体的行为。 ➢线程不包含进程地址空间中的代码和数据,线程是计算过程在某一时刻的状态。所以,系统在产生一个线程或各个线程之间切换时,负担要比进程小得多。 ➢线程是一个用户级的实体,线程结构驻留在用户空间中,能够被普通的用户级函数直接访问。 ➢一个线程本身不是程序,它必须运行于一个程序(进程)之中。因此,线程可以定义为一个程序中的单个执行流。 •多线程是指一个程序中包含多个执行流,多线程是实现并发的一种有效手段。一个进程在其执行过程中,可以产生多个线程,形成多个执行流。每个执行流即每个线程也有它自身的产生、存在和消亡的过程。 •多线程程序设计的含义就是可以将程序任务分成几个并行的子任务。 线程和进程的区别 ➢进程是资源分配的最小单位,线程是程序执行的最小单位 ➢ 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使 用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多

Python基础系列讲解——线程锁Lock的使用介绍

ぃ、小莉子 提交于 2019-12-12 23:05:54
我们知道Python的线程是封装了底层操作系统的线程,在Linux系统中是Pthread(全称为POSIX Thread),在Windows中是Windows Thread。因此Python的线程是完全受操作系统的管理的。但是在计算密集型的任务中多线程反而比单线程更慢。 这是为什么呢? 在CPython 解释器中执行线程时,每一个线程开始执行时,都会锁住 GIL,以阻止别的线程执行。同样的,每一个线程执行完一段后,会释放 GIL,以允许别的线程开始利用资源。毕竟,如果Python线程在开始的时候锁住GIL而不去释放GIL,那别的线程就没有运行的机会了。 为什么要这么处理呢? 我们先来介绍下竞争条件(race condition)这个概念。竞争条件是指两个或者多个线程同时竞争访问的某个资源(该资源本身不能被同时访问),有可能因为时间上存在先后原因而出现问题,这种情况叫做竞争条件(Race Condition)。(Python中进程是有独立的资源分配,线程是共用资源分配) 回到CPython上,CPython是使用引用计数器来管理内存的,所有创建的对象,都会有一个引用计数来记录有多少个指针指向它。如下所示: a_val = [] def ReferCount(): print(sys.getrefcount(a_val)) # 2 b = a_val c = a_val print

Python多线程编程(一):threading 模块 Thread 类的用法详解

混江龙づ霸主 提交于 2019-12-11 06:04:37
我们进行程序开发的时候,肯定避免不了要处理并发的情况。 一般并发的手段有采用多进程和多线程。 但线程比进程更轻量化,系统开销一般也更低,所以大家更倾向于用多线程的方式处理并发的情况。 Python 提供多线程编程的方式。 本文基于 Python3 讲解,Python 实现多线程编程需要借助于 threading 模块。 所以,我们要在代码中引用它。 import threading threading 模块中最核心的内容是 Thread 这个类。 我们要创建 Thread 对象,然后让它们运行,每个 Thread 对象代表一个线程,在每个线程中我们可以让程序处理不同的任务,这就是多线程编程。 值得注意的是,程序运行时默认就是在主线程上 创建 Thread 对象有 2 种手段。 直接创建 Thread ,将一个 callable 对象从类的构造器传递进去,这个 callable 就是回调函数,用来处理任务。 编写一个自定义类继承 Thread,然后复写 run() 方法,在 run() 方法中编写任务处理代码,然后创建这个 Thread 的子类。 直接创建 Thread 对象。 class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None) Thread

Python协程与Go协程的区别二

久未见 提交于 2019-12-10 20:33:38
写在前面 世界是复杂的,每一种思想都是为了解决某些现实问题而简化成的模型,想解决就得先面对,面对就需要选择角度,角度决定了模型的质量, 喜欢此UP主 汤质看本质 的哲学科普,其中简洁又不失细节的介绍了人类解决问题的思路,以及由概念搭建的思维模型对人类解决问题的重要性与限制.也认识到学习的本质就是: 认识获取(了解概念) -> 知识学习(建立模型) -> 技能训练(实践) 阅读也好, 学习也好, 妨碍我们「理解」的障碍主要有两个: 高度抽象的概念 「模型」无法关联现象 也就是说 概念明确 + 关系明确, 才能构成「模型」, 对照「现象」, 形成「理解」。 在理解编程知识时可以关键归纳为两点: 理解核心概念群+使用场景思考与故事化讲述 这里特别推荐码农翻身中大话编程式的科普: 码农翻身全年文章精华 并发模型 并发思想的一些探寻 并发之痛 Thread, Goroutine, Actor 中有较好的总结: 陈力就列, 不能者止 能干活的代码片段就放在线程里, 如果干不了活(需要等待, 被阻塞等), 就摘下来。通俗的说就是不要占着茅坑不拉屎, 如果拉不出来, 需要酝酿下, 先把茅坑让出来, 因为茅坑是稀缺资源。 要做到这点一般有两种方案: 异步回调方案 典型如NodeJS, 遇到阻塞的情况, 比如网络调用, 则注册一个回调方法(其实还包括了一些上下文数据对象)给IO调度器

进程与线程

Deadly 提交于 2019-12-10 19:53:03
1.终止进程的两种方式: 1.join()让主进程等待子进程和结束,并回收子进程资源,主进程再结束并回收资源。 2.主进程正常结束,子进程与主进程一并被回收资源。 from multiprocessing import Processimport timedef task(): print('start...') time.sleep(2) print('end...')if __name__ == '__main__': p = Process(target=task) p.start() p.join() #不加join会先不等待子进程,主进程先回收 print('主进程结束') 2.僵尸进程与孤儿进程: 僵尸进程: 在子进程结束后,主进程没有正常结束,子进程PID不会被回收。 缺点: 1.操作系统中的pid是有限的,如果子进程pid号无法正常回收,则会占用pid号 2.浪费资源 3.若pid号满了,则无法创建新的进程。 孤儿进程: 在子进程没有结束的时候主进程没有正常结束,子进程不会被会回收。 操作系统优化机制(孤儿院) 当主进程意外终止,操作系统会检测是否有正在运行的子进程,会将他们放入孤儿院中,让操纵系统帮你自动回收。 from multiprocessing import Processfrom multiprocessing import current

理解 Python 中的多线程

我的未来我决定 提交于 2019-12-10 19:10:43
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我们将会看到一些在 Python 中使用线程的实例和如何避免线程之间的竞争。 你应当将下边的例子运行多次,以便可以注意到线程是不可预测的和线程每次运行出的不同结果。声明:从这里开始忘掉你听到过的关于 GIL 的东西,因为 GIL 不会影响到我想要展示的东西。 示例 1, 我们将要请求五个不同的url: 1、单线程 import time import urllib2 def get_responses(): urls = [ 'http://www.google.com', 'http://www.amazon.com', 'http://www.ebay.com', 'http://www.alibaba.com', 'http://www.reddit.com' ] start = time.time() for url in urls: print url resp = urllib2.urlopen(url) print resp.getcode() print "Elapsed time: %s" % (time.time()-start) get_responses() 输出是: http://www.google.com 200 http://www.amazon.com 200 http:/