1. 每日3题是麦叔的面试系列专题之一,每天包括初级,中级,高级难度题目各一道。
  2. 每日3题,100天之后成为大牛!
  3. 如果有不明白的,给麦叔留言。

[Easy] python中进程与线程的使用场景?

思考30秒再往下翻...

多进程适合在CPU密集操作(cpu操作指令比较多,如位多的的浮点运算)。

多线程适合在IO密性型操作(读写数据操作比多的的,比如爬虫)

[Normal] 什么是死锁?

思考30秒再往下翻...

若干子线程在系统资源竞争时,都在等待对方对某部分资源解除占用状态,结果是谁也不愿先解锁,互相干等着,程序无法执行下去,这就是死锁。

GIL锁 全局解释器锁

作用:限制多线程同时执行,保证同一时间只有一个线程执行,所以cython里的多线程其实是伪多线程!

所以python里常常使用协程技术来代替多线程,协程是一种更轻量级的线程。

进程和线程的切换时由系统决定,而协程由我们程序员自己决定,而模块gevent下切换是遇到了耗时操作时才会切换

三者的关系:进程里有线程,线程里有协程。

下面的例子,程序会永远卡在那里

from threading import Threadfrom threading import Lockimport time

lock1 = Lock()lock2 = Lock()

def work1(num):    lock1.acquire()  # lock1上锁    time.sleep(1)    print("in work1")    lock2.acquire()  # lock2上锁    print("work1-----")    lock2.release()  # lock2解锁    lock1.release()  # lock1解锁

def work2(num):    lock2.acquire()  # lock2加锁    print("in work2")    lock1.acquire()  # lock1加锁    print("work1-----")    lock1.release()  # lock1解锁    lock2.release()  # lock2解锁

if __name__ == '__main__':    t1 = Thread(target=work1,args=(1000000,))    t2 = Thread(target=work2, args=(1000000,))    t1.start()    t2.start()

[Hard] Session,Cookie,JWT的理解

思考30秒再往下翻...

为什么要使用会话管理

众所周知,HTTP协议是一个无状态的协议,也就是说每个请求都是一个独立的请求,请求与请求之间并无关系。但在实际的应用场景,这种方式并不能满足我们的需求。举个大家都喜欢用的例子,把商品加入购物车,单独考虑这个请求,服务端并不知道这个商品是谁的,应该加入谁的购物车?因此这个请求的上下文环境实际上应该包含用户的相关信息,在每次用户发出请求时把这一小部分额外信息,也做为请求的一部分,这样服务端就可以根据上下文中的信息,针对具体的用户进行操作。所以这几种技术的出现都是对HTTP协议的一个补充,使得我们可以用HTTP协议+状态管理构建一个的面向用户的WEB应用。

Session 和Cookie的区别

这里我想先谈谈session与cookies,因为这两个技术是作为开发最为常见的。那么session与cookies的区别是什么?个人认为session与cookies最核心区别在于额外信息由谁来维护。利用cookies来实现会话管理时,用户的相关信息或者其他我们想要保持在每个请求中的信息,都是放在cookies中,而cookies是由客户端来保存,每当客户端发出新请求时,就会稍带上cookies,服务端会根据其中的信息进行操作。当利用session来进行会话管理时,客户端实际上只存了一个由服务端发送的session_id,而由这个session_id,可以在服务端还原出所需要的所有状态信息,从这里可以看出这部分信息是由服务端来维护的。

除此以外,session与cookies都有一些自己的缺点:

cookies的安全性不好,攻击者可以通过获取本地cookies进行欺骗或者利用cookies进行CSRF攻击。使用cookies时,在多个域名下,会存在跨域问题。session 在一定的时间里,需要存放在服务端,因此当拥有大量用户时,也会大幅度降低服务端的性能,当有多台机器时,如何共享session也会是一个问题.(redis集群)也就是说,用户第一个访问的时候是服务器A,而第二个请求被转发给了服务器B,那服务器B如何得知其状态。实际上,session与cookies是有联系的,比如我们可以把session_id存放在cookies中的。

JWT是如何工作的

首先用户发出登录请求,服务端根据用户的登录请求进行匹配,如果匹配成功,将相关的信息放入payload中,利用算法,加上服务端的密钥生成token,这里需要注意的是secret_key很重要,如果这个泄露的话,客户端就可以随机篡改发送的额外信息,它是信息完整性的保证。生成token后服务端将其返回给客户端,客户端可以在下次请求时,将token一起交给服务端,一般是说我们可以将其放在Authorization首部中,这样也就可以避免跨域问题。


支持麦叔,请点在看,谢谢!

python 多线程伪_Python每日3题什么是死锁?相关推荐

  1. python函数名字_Python每日3题-为什么函数名字可以当做参数用?

    每日3题是麦叔的面试系列专题之一,每天包括初级,中级,高级难度题目各一道. 每日3题,100天之后成为大牛! 如果有不明白的,给麦叔留言. [Easy] 为什么函数名字可以当做参数用? 思考30秒再往 ...

  2. python每日一题今天的答案_python每日一题总结1

    每日一题1 1. 写出python中import 导入库的几种常见写法 举例:import math from math imourt sqrt 每日一题2 1. print 1000L  的结果 答 ...

  3. python每日一题公众号_python每日一题总结4

    20180609 qzd 每日一题14 输入三个整数x,y,z,请把这三个数由小到大输出. my code x=int(input('x:')) y=int(input('y:')) z=int(in ...

  4. python读取7个数(1-50)的整数值_python每日一题总结7

    20180618 qzd 总结:全 每日一题23 读取7个数(1-50)的整数值,每读取一个值,程序打印出该值个数的*. my code: for i in range(7): n=int(input ...

  5. python多线程编程_python多线程编程(1): python对多线程的支持

    前面介绍过多线程的基本概念,理解了这些基本概念,掌握python多线程编程就比较容易了. 在开始之前,首先要了解一下python对多线程的支持. 虚拟机层面 Python虚拟机使用GIL(Global ...

  6. python多线程挂了_python多线程输入的问题 python高效编程技巧13(如何在线程之间实现...

    python3 创建线程时不用args传参,执行线程时为什如果创建线程时在target里就传入了参数,为什么在启动线程时,线程不是在Python多线程下,每个线程的执行方式: 有什么了不起,大不了继续 ...

  7. python多线程输出_Python多线程

    多线程基础概念 并行与并发 并行:同时处理多个任务,必须在多核环境下 一段时间内同时处理多个任务,单核也可以并发 并发手段 线程:内核空间的调度 进程:内核空间的调度 协程:用户空间的调度 线程可以允 ...

  8. python 多线程 模块_Python多线程threading和multiprocessing模块实例解析

    本文研究的主要是Python多线程threading和multiprocessing模块的相关内容,具体介绍如下. 线程是一个进程的实体,是由表示程序运行状态的寄存器(如程序计数器.栈指针)以及堆栈组 ...

  9. python多线程执行_python多线程实现同时执行两个while循环

    如果想同时执行两个while True循环,可以使用多线程threading来实现. 完整代码 #coding=gbk from time import sleep, ctime import thr ...

  10. python多线程扫描_Python多线程扫描端口代码示例

    本文代码实现Python多线程扫描端口,具体实现代码如下. #coding:utf-8 import socket import thread import time socket.setdefaul ...

最新文章

  1. LINUX中断学习笔记【转】
  2. Cloud Native Computing Foundation Welcomes the NATS Messaging Protocol into the Fold
  3. 51nod 1087 1 10 100 1000
  4. mybatisplus查询今天的数据_MybatisPlus(CRUD)
  5. java for loop_Java for循环执行了两次
  6. PHP抽象类abstract关键字
  7. 使用Certbot 生成 https 证书
  8. 多路平衡查找树(B Tree)(分裂、合并)
  9. java.lang.NoSuchMethodError: org.apache.flink.table.api.TableColumn.isGenerated()Z
  10. 【线性代数公开课MIT Linear Algebra】 第十八课 行列式的性质
  11. android OpenGL ES实现渲染到透明的纹理 render to transparent texture
  12. python代替shell脚本_自动化shell脚本except与python的pexpect模块
  13. oracle中主键自增长,Oracle中给主键设置自增长
  14. 浏览器transform介绍
  15. vue2快速生成代码片段
  16. cocos2dx.3.17中用VS2017启动本地windows调试器出现脚本错误解决办法
  17. 2013-1-20·
  18. Microsoft Edge浏览器网页改为纯黑色(将浏览器网页底色改为黑色)
  19. nb 底特律 外包公司,招人,
  20. Android 开发 | App 工程目录结构

热门文章

  1. rsync增量同步标志位详细解释
  2. Could not get unknown property 'packageForR' for task ':app:processDebugReso
  3. mongoose 常用数据库操作 更新
  4. debug [LTS]
  5. 内部排序算法(Golang版本)
  6. ASP.Net中防止页面刷新重复提交的几种方法
  7. 如何删除PeopleSoft Process Definition
  8. ActiveMQ(四)——异步发消息、异步消费消息与prefetchSize之间的关系
  9. Spring框架入门程序:获取Bean的三种方式
  10. Tomcat配置虚拟路径使上传文件和服务器分离及上传文件