cpython

一、python快速入门(每个知识点后包含练习)

為{幸葍}努か 提交于 2020-05-02 11:50:03
1. 编程与编程语言 编程的目的是什么? # 计算机的发明,是为了用机器取代/解放人力,而编程的目的则是将人类的思想流程按照某种能够被计算机识别的表达方式传递给计算机,从而达到让计算机能够像人脑/电脑一样自动执行的效果。 什么是编程语言? # 上面提及的能够被计算机所识别的表达方式即编程语言,语言是沟通的介质,而编程语言是程序员与计算机沟通的介质。在编程的世界里,计算机更像是人的奴隶,人类编程的目的就命令奴隶去工作。 什么是编程? # 编程即程序员根据需求把自己的思想流程按照某种编程语言的语法风格编写下来,产出的结果就是包含一堆字符的文件。 # 强调:程序在未运行前跟普通文件无异,只有程序在运行时,文件内所写的字符才有特定的语法意义  所以 Python是语言,而学习语言的套路都是一样的,以英语学习为例,你需要学单词,然后学语法,最后写作文。 英语的单词---------->Python中的关键字 英语的语法---------->Python的语法 英语的作文---------->用Python语言写的程序 有人说python很简单,全都是在记忆一些固定的套路而已。学习没有捷径,要经过几万行代码的洗礼,才有可能成为一名优秀的程序员。 屌丝到不能再屌丝的我们,如果没有这点意志力,就别妄想咸鱼翻身了。 2. 编程语言分类 编程的语言的发展经历了 # 机器语言:站在计算机(奴隶)的角度

Python GIL(Global Interpreter Lock)

浪子不回头ぞ 提交于 2020-05-02 10:00:28
一,介绍 定义: 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.)   结论:在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势    首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时 所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成 可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样 一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython

python 多线程编程并不能真正利用多核的CPU

我与影子孤独终老i 提交于 2020-05-02 09:59:10
GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题。运行下面这段 python 程序,CPU 占用率是多少? # 请勿在工作中模仿,危险:) def dead_loop (): while True : pass dead_loop () 答案是什么呢,占用 100% CPU?那是单核!还得是没有超线程的古董 CPU。在我的双核 CPU 上,这个死循环只会吃掉我一个核的工作负荷,也就是只占用 50% CPU。那如何能让它在双核机器上占用 100% 的 CPU 呢?答案很容易想到,用两个线程就行了,线程不正是并发分享 CPU 运算资源的吗。可惜答案虽然对了,但做起来可没那么简单。下面的程序在主线程之外又起了一个死循环的线程 import threading def dead_loop (): while True : pass # 新起一个死循环线程 t = threading . Thread ( target = dead_loop ) t . start () # 主线程也进入死循环 dead_loop () t . join () 按道理它应该能做到占用两个核的 CPU 资源,可是实际运行情况却是没有什么改变,还是只占了 50% CPU 不到。这又是为什么呢?难道 python

Python编码规范(PEP8)

心不动则不痛 提交于 2020-05-02 09:53:16
Introduction 介绍 本文提供的Python代码编码规范基于Python主要发行版本的标准库。Python的C语言实现的C代码规范请查看相应的PEP指南 1 。 这篇文档以及 PEP 257 (文档字符串的规范)改编自Guido原始的《Python Style Guide》一文,同时添加了一些来自Barry的风格指南 2 。 这篇规范指南随着时间的推移而逐渐演变,随着语言本身的变化,过去的约定也被淘汰了。 许多项目有自己的编码规范,在出现规范冲突时,项目自身的规范优先。 A Foolish Consistency is the Hobgoblin of Little Minds 尽信书,则不如无书 Guido的一条重要的见解是代码阅读比写更加频繁。这里提供的指导原则主要用于提升代码的可读性,使得在大量的Python代码中保持一致。就像 PEP 20 提到的,“Readability counts”。 这是一份关于一致性的风格指南。这份风格指南的风格一致性是非常重要的。更重要的是项目的风格一致性。在一个模块或函数的风格一致性是最重要的。 然而,应该知道什么时候应该不一致,有时候编码规范的建议并不适用。当存在 模棱两可 的情况时,使用自己的判断。看看其他的示例再决定哪一种是最好的,不要羞于发问。 特别是不要为了遵守PEP约定而破坏兼容性! 几个很好的理由去忽略特定的规则:

python 之 并发编程(守护线程与守护进程的区别、线程互斥锁、死锁现象与递归锁、信号量、GIL全局解释器锁)

 ̄綄美尐妖づ 提交于 2020-05-02 09:25:13
9.94 守护线程与守护进程的区别 1. 对主进程来说,运行完毕指的是主进程代码运行完毕 2. 对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕 ​ 详细解释: 1.主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束, 2.主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。 9.95 线程互斥锁 from threading import Thread,Lock import time mutex = Lock() x =100 def task(): global x mutex.acquire() temp = x time.sleep( 0.1 ) x =temp-1 mutex.release() ​ if __name__ == ' __main__ ' : start = time.time() t_l = [] for i in range(100 ): t =Thread(target= task) t_l.append(t) t.start() for t in t_l: t.join()

Python面试简介及并行并发

空扰寡人 提交于 2020-05-02 08:31:23
今天的分享内容大体如下: 一. 面试 1. 什么是面试 2. 优秀的面试 二. Python综述 1. Python设计哲学及版本变迁 2. Python发展现状及其他语言使用场景 3. GIL 4. 内存管理和垃圾回收 5. 面试示例 三、并发并行 1. 进程 2. 线程 3. 协程 4. 并发编程 一、 面试 什么是面试 面:当面 / 面谈 / 面聊, 试:考试,当前社会上各大企业和公司招人环节中最重要的一道流程关卡;目前面试已经衍生了多种操作形式:直面、电面、视频面、在线 coding ; 一轮面试的过程中,面试官期待什么呢?面试又希望找到什么样的人呢? ... 面试官通过面试找到技能能力符合岗位预期、综合素质(价值观、协作、沟通、逻辑思维等)优秀的候选人; 2. 优秀的面试 了解了面试官的出发点后,站在应聘者的角度,我们又怎样去看待呢?一轮优秀的面试过程是怎么样的呢? --- 优秀的面试应该是 “ 能够最大化向面试官展示自己的技术能力和综合素质符合所应聘的岗位 ” ,候选人本人是面试过程中的主人翁,面试过程中应该要学会以下几点: 1). 控场:应聘者本身是面试过程中的主角,如果能无形中大体控制整个面试过程的流程走向,将其朝向预期的方向发展,一般也就离成功不远了。大多数公司单轮面试时间会在 20-60 分钟左右(少于 20 分钟基本希望不大,大于 1

并发编程-线程-死锁现象-GIL全局锁-线程池

风格不统一 提交于 2020-05-02 08:31:07
一堆锁 死锁现象 (重点) 死锁指的是某个资源被占用后,一直得不到释放,导致其他需要这个资源的线程进入阻塞状态. 产生死锁的情况 对同一把互斥锁加了多次 一个共享资源,要访问必须同时具备多把锁,但是这些锁被不同线程或者进程所持有,就会导致相互等待对方释放从而程序就卡死了 第二种情况的解决方法: 抢锁一定按照相同的顺序去抢 给抢锁加上超时,如果超时则放弃执行 递归锁 (了解) 与普通的区别 相同: 多线程之间都有互斥的效果 不同: 同一个线程可以对这个锁执行多次acquire 解决方法 同一个线程必须保证,加锁的次数和解锁的次数相同,其他线程才能够抢到这把锁 信号量 (了解) 可以限制同时并执行公共代码的线程数量 如果限制数量为1,则与普通互斥锁没有区别(默认为1) from threading import Semaphore,current_thread,Thread import time s = Semaphore(2) def task(): s.acquire() time.sleep(1) print(current_thread().name) s.release() for i in range(10): Thread(target=task).start() # 结果是每次都会执行两个子线程 GIL全局锁 (重点) 什么是GIL锁? 在cpython中

python学习笔记之线程、进程和协程(第八天)

我只是一个虾纸丫 提交于 2020-05-02 08:30:48
参考文档: 金角大王博客:http://www.cnblogs.com/alex3714/articles/5230609.html 银角大王博客:http://www.cnblogs.com/wupeiqi/articles/5040827.html 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。 更多方法: start 线程准备就绪,等待 CPU 调度 setName 为线程设置名称 getName 获取线程名称 setDaemon 设置为后台线程或前台线程(默认) 如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止 如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停 join 逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义 run 线程被 cpu 调度后自动执行线程对象的 run 方法 一、线程有2种调用方式: 1、直接调用 2、 继承式调用 具体实例如下: 直接调用 import threading,time import os,sys def

真正的python 多线程!一个修饰符让你的多线程和C语言一样快

让人想犯罪 __ 提交于 2020-05-02 08:30:12
> Python 多线程因为GIL的存在,导致其速度比单线程还要慢。但是近期我发现了一个相当好用的库,这个库只需要增加一个修饰符就可以使原生的python多线程实现真正意义上的并发。本文将和大家一起回顾下GIL对于多线程的影响,以及了解通过一个修饰符就可以实现和C++一样的多线程。 ## GIL的定义 GIL的全称是global interpreter lock,官方的定义如下: 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.) 从官方的解释来看,这个全局锁是用来防止多线程同时执行底层计算代码的。之所以这么做,是因为底层库Cpython,在内存管理这块是线程不安全的。 ##

python Thread、lock

无人久伴 提交于 2020-05-02 08:29:59
Python的标准库提供了两个模块: _thread 和 threading , _thread 是低级模块, threading 是高级模块,对 _thread 进行了封装。绝大多数情况下,我们只需要使用 threading 这个高级模块。 启动一个线程就是把一个函数传入并创建 Thread 实例,然后调用 start() 开始执行: import time, threading # 新线程执行的代码: def loop (): print( 'thread %s is running...' % threading.current_thread().name) n = 0 while n < 5: n = n + 1 print( 'thread %s >>> %s' % (threading.current_thread().name, n)) time.sleep( 1) print( 'thread %s ended.' % threading.current_thread().name) print( 'thread %s is running...' % threading.current_thread().name) t = threading.Thread(target=loop, name= 'LoopThread') t.start() t.join()