python多线程

Python多线程编程之多线程加锁

倾然丶 夕夏残阳落幕 提交于 2020-02-28 07:56:22
Python语言本身是支持多线程的 ,不像PHP语言。 下面的例子是 多个线程做同一批任务 ,任务总是有task_num个,每次线程做一个任务(print),做完后继续取任务,直到所有任务完成为止。 1 #coding:utf-8 2 import threading 3 4 start_task = 0 5 task_num = 10000 6 mu = threading.Lock() ###通过工厂方法获取一个新的锁对象 7 8 class MyThread(threading.Thread): ###类MyThread继承基类threading.Thread 9 10 def run(self): ##线程启动的入口函数,子类需重写 11 global start_task 12 global mu 13 global start_task 14 15 while start_task < task_num: ##如果任务没有完成,则继续 16 if mu.acquire(): ##加锁 17 if start_task < task_num: 18 print start_task 19 start_task = start_task + 1 20 mu.release() ##释放锁 21 22 def test(): 23 thread_all = [] 24 for

进程和线程

≯℡__Kan透↙ 提交于 2020-02-28 06:45:00
进程和线程: 1、进程概念: 进程:就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。进程可以通过fork或spawn的方式来创建新的进程来执行其他的任务,不过新的进程也有自己独立的内存空间,因此必须通过进程间通信机制(IPC,Inter-Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存区等。 2、线程概念: 一个进程还可以拥有多个并发的执行线索,简单的说就是拥有多个可以获得CPU调度的执行单元,这就是所谓的线程。 3、多进程概念: Unix和Linux操作系统上提供了 fork() 系统调用来创建进程,调用 fork() 函数的是父进程,创建出的是子进程,子进程是父进程的一个拷贝,但是子进程拥有自己的PID。 fork() 函数非常特殊它会返回两次,父进程中可以通过 fork() 函数的返回值得到子进程的PID,而子进程中的返回值永远都是0。Python的os模块提供了 fork() 函数。由于Windows系统没有 fork() 调用,因此要实现跨平台的多进程编程,可以使用multiprocessing模块的 Process 类来创建子进程,而且该模块还提供了更高级的封装

进程,线程,协程的区别

谁说我不能喝 提交于 2020-02-27 13:19:43
都可以提高并发能力 进程和线程是计算机中真是存在的,而协程是程序员人为创造出来的 #是什么 进程是计算机资源分配的最小单位. 线程是计算机中可以被cpu调度的最小单位. 协程也可以称为“微线程”,实际上让一个线程轮番执行一些任务 #联系 一个进程中可以有多个线程,同一个进程中的线程可以共享此进程中的资源, 一个线程可以有多个协程, 一个应用程序中至少有一个进程,一个进程中至少有一个线程 #应用场景 在Python中因为有GIL锁,他同一时刻保证一个进程中只有一个线程可以被cpu调度,所以在使用Python开发时要注意: 计算密集型,用多进程. IO密集型,用多线程/协程+IO操作 单纯的协程没办法提高并发,只是代码之间的切换,加上IO自动切换才能有意义 默认进程之间无法进行资源共享,如果主要想要通讯可以基于:文件/网络/Queue. 资源浪费 进程>线程>协程+IO切换 节省时间 进程≈线程≈协程+IO操作<串行操作 形象的关系 工厂 -> 应用程序 车间 -> 进程 工人 -> 线程 螺丝钉->协程 来源: CSDN 作者: 封凌寒武 链接: https://blog.csdn.net/zflhw/article/details/104532906

二十八、Python之线程的GIL问题

老子叫甜甜 提交于 2020-02-27 12:54:11
1. GIL是什么 GIL(Global Interpreter Lock)并不是python的特性,而是Python解释器Cpython引入的一个概念。而python的解释器不仅仅只有Cpython,若解释器为Jpython,那么python就没有GIL。 官方的解释: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.) 2.产生的原因 由于物理上得限制,各CPU厂商在核心频率上的比赛已经被多核所取代。为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据一致性和状态同步的困难。即使在CPU内部的Cache也不例外

Python面试重点(进阶篇)

雨燕双飞 提交于 2020-02-27 12:19:32
第一部分 必答题 简述 OSI 7层模型及其作用?(2分) 应用层:与用户直接交互,软件、网站等 表示层:使用软件、网站可以查看的数据,图片等 会话层:保持登录状态,电脑中为cookie 传输层:选择TCP/UDP协议,进行数据发送。 网络层:通过IP路径寻址,并且对数据进行封装 数据链路层:使用mac地址寻址,又进行了数据封装 物理层:将上面得到的数据转化为信号 简述 TCP三次握手、四次回收的流程。(3分) 三次握手: 第一次握手:Client将标志设置为SYN=1,随机产生一个seq=J,并将该数据包发送给server,client进入SYN_SENT状态,等待server确认。 第二次握手:server收到数据包后由标志位SYN=1知道client请求建立链接,server将标志位SYN和ACK都设置为1,ack=J+1,随机产生一个值seq=K,并将数据包发送给client确认连接,server进入syn_rcvd状态。 第三次握手:client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK设置为1,ack=K+1,并将该数据包发送给server,server检查ack是否为K+1,ACK是否为1,如果正确则建立链接,client和server进入ESTABALISED状态,完成三次握手。 四次挥手: 第一次挥手

python3 多线程和多进程

对着背影说爱祢 提交于 2020-02-27 05:20:39
一.线程和进程 1.操作系统中,线程是CPU调度和分派的基本单位,线程依存于程序中 2.操作系统中,进程是系统进行资源分配和调度的一个基本单位,一个程序至少有一个进程 3.一个进程由至少一个线程组成,线程组成进程 4.多进程、多进程实际是进程、线程、进程和线程的并发而不是并行,用来加快程序运行速度 5.Python既支持多线程,也支持多进程。 二.多线程threading 1.python3线程操作中常用模块:_thread和threading,其中一般都用threading模块 2.线程分为: 内核线程: 由操作系统内核创建和撤销; 用户线程: 不需要内核支持而在用户程序中实现的线程 3.Python中使用线程有两种方式:函数或者用类来包装线程对象 2. 创建线程 1 import threading 2 3 #def main():#定义一个存放多线程的函数 4 # print(threading.active_count())#获取已激活的线程数 5 # print(threading.enumerate()) # see the thread list查询线程信息 6 # print(threading.current_thread())#查询当前运行的线程 7 8 def thread_job():#定义一个线程的工作的函数 9 print('This is a

二十六、Python之线程编程(Thread)

扶醉桌前 提交于 2020-02-26 12:09:56
线程基本概念 1. 什么是线程 【 1 】 线程被称为轻量级的进程 【 2 】 线程也可以使用计算机多核资源,是多任务编程方式 【 3 】 线程是系统分配内核的最小单元 【 4 】 线程可以理解为进程的分支任务 2. 线程特征 【 1 】 一个进程中可以包含多个线程 【 2 】 线程也是一个运行行为,消耗计算机资源 【 3 】 一个进程中的所有线程共享这个进程的资源 【 4 】 多个线程之间的运行互不影响各自运行 【 5 】 线程的创建和销毁消耗资源远小于进程 【 6 】 各个线程也有自己的 ID 等特征 threading 模块创建线程 【 1 】 创建线程对象 from threading import Thread t = Thread() 功能:创建线程对象 参数: target 绑定线程函数 args 元组 给线程函数位置传参 kwargs 字典 给线程函数键值传参 【 2 】 启动线程 t.start() 【 3 】 回收线程 t.join([timeout]) 示例1: """ 线程示例 """ import threading from time import sleep import os a = 1 def music(): global a print("子进程a:", a) # a = 1 a = 10000 for i in range(5): sleep

Flask 作者 Armin Ronacher:我不觉得有异步压力

安稳与你 提交于 2020-02-26 01:49:01
英文 | I'm not feeling the async pressure 【1】 原作 | Armin Ronacher,2020.01.01 译者 | 豌豆花下猫@Python猫 声明 :本翻译基于 CC BY-NC-SA 4.0 【2】授权协议,内容略有改动,转载请保留原文出处,请勿用于商业或非法用途。 异步(async)正风靡一时。异步Python、异步Rust、go、node、.NET,任选一个你最爱的语言生态,它都在使用着一些异步。异步这东西有多好,这在很大程度上取决于语言的生态及其运行时间,但总体而言,它有一些不错的好处。它使得这种事情变得非常简单:等待可能需要一些时间才能完成的操作。 它是如此简单,以至于创造了无数新的方法来坑人(blow ones foot off)。我想讨论的一种情况是,直到系统出现超载,你才意识到自己踩到了脚的那一种,这就是背压(back pressure)管理的主题。在协议设计中有一个相关术语是流量控制(flow control)。 什么是背压 关于背压的解释有很多,我推荐阅读的一个很好的解释是: Backpressure explained — the resisted flow of data through software 【3】。因此,与其详细介绍什么是背压,我只想对其做一个非常简短的定义和解释:背压是阻碍数据在系统中流通的阻力

Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程

老子叫甜甜 提交于 2020-02-25 11:13:19
1 引言   并发、并行、串行、同步、异步、阻塞、非阻塞、进程、线程、协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念。 2 并发与并行   在解释并发与并行之前,我们必须先明确: 单个处理器(一个单核CPU)在某一个时刻只能处理一个线程 。   并发是指在同一个处理器上通过时间片轮转的方式在多个线程之间频繁切换,由于切换速度极快,所以看似多个线程似乎被同时执行,但实际上每一个时刻都只有一个线程被执行,其他的线程出于阻塞状态。   并行是指多个处理器在同一时刻同时处理了多个不同的线程,这才是真正意义的同时被执行。   如下图所示,线程A与线程B同在一个CPU内执行,且任一t时刻内,都只有一个线程(A或者B)被执行,所以线程A与线程B是并发执行的。线程C和线程D分别在两个CPU内执行,且在某一个t时刻内同时都在执行,所以线程C和线程D是并行的。 3 并行与串行   上面已经说到,并行是指多个任务同时执行,而 串行 是指多个任务时,各个任务按顺序执行,完成一个之后才能进行下一个。   所以,并发与并行是在某一时刻是否都在执行的区别。并行与串行是同时进行或一个结束才进行下一个的区别。 4 同步与异步   同步与异步的概念与消息的通知机制有关:    同步 是指线程在访问某一资源时,获得了资源的返回结果之后才会执行其他操作

协程笔记说明

徘徊边缘 提交于 2020-02-22 16:29:47
协程笔记说明 协程的定义 通过使用yield完成多任务 greenlet进行封装来替换生成器 gevent实现多任务 不依赖gevent的自带延时和阻塞切换 协程和线程差异 进程、线程和协程对比 协程的定义 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。 通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定。 通过使用yield完成多任务 import time def task_1(): while True: print("---1----") time.sleep(0.1) yield def task_2(): while True: print("---2----") time.sleep(0.1) yield def main(): t1 = task_1() t2 = task_2() # 先让t1运行一会,当t1中遇到yield的时候,再返回到t2,然后 # 执行t2