【python学习】从海贼王中体会进程、线程和协程

二进制打工人 等级 480 1 0

【python学习】从海贼王中体会进程、线程和协程

在学习Python的过程中,一种最直接的感触就是上手轻松,但精通很难,很多时候离不开计算机学科的基础知识。比如下面这个问题,我是没法第一时间想到准确答案的。

  • 协程线程有什么区别?

在学习的道路上,看懂听懂是输入,写明说清是输出,只有达到输出这一步才算真正搞懂一个知识点。So,今天就先搞搞这个问题,用海贼王的故事来理解个中差异。

协程线程,我再加个进程

1 进程

进程(process)是一个执行中的程序。每个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据。操作系统管理其上所有进程的执行,并为这些进程合理地分配时间。因为每个进程都拥有自己的内存和数据栈等,所以只能采用进程间通信(IPC)的方式共享信息。

进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。

OK,下面就到了海贼show time。

话说路飞一行人从新手村开始,斩世界政府旗帜,闯海军本部,灭七武海,挑四皇,一直打怪升级,练就一身本领,霸气外露。如今来到了和之国,正和小伙伴一起讨伐凯多。这个时候,讨伐凯多(和之国篇)就是海贼王世界中的一个进程,它的地址空间是凯多大本营——和之国。【python学习】从海贼王中体会进程、线程和协程 那要如何才能灭了凯多呢?讨伐大军需要先混入敌军地盘,接着潜伏收集情报,然后密谋计划,最后杀入敌营斩下凯多首级,这些属于整个讨伐进程的子进程。讨伐大军是怎么获取的情报,敌人老窝是怎么潜入的,路飞是怎么打的,佐罗是怎么砍的。。。这些就属于进程代码段的内容。凯多也不是吃素的,起飞鬼岛砸向花之都,鬼岛的飞行时间应该就是整个剧情高潮时间,是一个全局变量,属于进程数据段内容。这边草帽一伙打得火热,世界政府、海军、革命军也没闲着,虽然作者没有交代,但也在海贼世界中进行着,这些就构成了海贼王里的多进程【python学习】从海贼王中体会进程、线程和协程

python中的进程模块multiprocessing多进程举例

# 进程代码
import os
from multiprocessing import Process


def fun_1(str):
    print("海贼王子进程id:", os.getpid(), str)


def main():
    p1 = Process(target=fun_1, args=('进程1:讨伐凯多',))
    p2 = Process(target=fun_1, args=('进程2:革命军在搞事',))
    p3 = Process(target=fun_1, args=('进程3:世界政府在观察',))

    p1.start()
    p2.start()
    p3.start()
    print('海贼王主进程id:', {os.getpid()})


if __name__ == '__main__':
    main()

输出结果(每次运行结果不同): 【python学习】从海贼王中体会进程、线程和协程

2 线程

线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

线程是在进程下执行的,并共享上下文,因此同一个进程下的线程间通信更加容易。子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。

好 ,现在继续我们的海贼之旅。

要灭了凯多可不是一件容易的事,凯多方人多势众,还和大妈结盟,战力杠杠。那怎么搞定他们呢?所有人聚在一起刚正面,那估计路飞还没碰到凯多就累死了,所以为了尽快实现目的,每个角色都找到了自己的对手,王对王、将对将、兵对兵,大家分别PK。路飞、佐罗几人挑凯多和大妈;马尔科vs烬和奎因;甚平vs福斯福;弗兰克vs佐佐木。。。每一场战斗都是讨伐凯多进程当中的线程,分别执行,互不干扰,可以认为是并发【python学习】从海贼王中体会进程、线程和协程 另外,在海贼王中还有一个角色具有多线程的特性,就是“匪帮”卡彭·贝基,他的坚城果实能力,直接让其可以轻松以一敌百。 【python学习】从海贼王中体会进程、线程和协程

python中多线程代码举例

import threading
import time

exitFlag = 0

class myThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        print ("开始线程:" + self.name)
        print_time(self.name, self.counter, 5)
        print ("退出线程:" + self.name)

def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            threadName.exit()
        time.sleep(delay)
        print ("%s: %s" % (threadName, time.ctime(time.time())))
        counter -= 1

if __name__ == "__main__":
    # 创建新线程
    thread1 = myThread(1, "线程1-路飞vs凯多", 1)
    thread2 = myThread(2, "线程2-甚平vs福斯福", 2)

    # 开启新线程
    thread1.start()
    thread2.start()
    thread1.join()
    thread2.join()
    print ("退出讨伐凯多主线程")

输出结果为: 【python学习】从海贼王中体会进程、线程和协程

3 协程

协程 (coroutine),又称为微线程,它是实现多任务的另一种方式,只不过是比线程更小的执行单元。因为它自带CPU的上下文,这样只要在合适的时机,我们可以把一个协程切换到另一个协程。

在一个线程中的某个函数中,我们可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定。

终于,到我们的真男人-山治出来秀一波了。

西服、香烟的标配,这就是我们的绅士-山治,凭一双脚踢出一个世界的男人。不过在和之国篇中变现还不出彩,在面对黑玛丽亚的时候发生中断无法施展自己的实力,山治只能向罗宾发出求救信号。罗宾这边一收到信号,就yield知道了。整个过程都是山治在执行求救信号,直到信号次数达到一个阀值,罗宾出现了。 【python学习】从海贼王中体会进程、线程和协程

python中协程代码理解

def luobin():
    r = ''
    while True:
        n = yield r
        if not n:
            return
        if n == 5:
            print("[罗宾] 我听到第 %s 次求救了,我到了" % n)
        else:
            print('[罗宾] 我听到第 %s 次求救了,马上来' % n)
            r = '知道了,马上'

def shanzhi(c):
    c.send(None)
    n = 0
    while n < 5:
        n = n + 1
        print('[山治] 第 %s 次求救:罗宾快来救我' % n)
        r = c.send(n)
        if n == 5:
            print('[山治] 罗宾你来了!')
        else:
            print('[山治] 罗宾回答: %s' % r)
    c.close()

c = luobin()
shanzhi(c)

输出结果为:

[山治] 第 1 次求救:罗宾快来救我
[罗宾] 我听到第 1 次求救了,马上来
[山治] 罗宾回答: 知道了,马上
[山治] 第 2 次求救:罗宾快来救我
[罗宾] 我听到第 2 次求救了,马上来
[山治] 罗宾回答: 知道了,马上
[山治] 第 3 次求救:罗宾快来救我
[罗宾] 我听到第 3 次求救了,马上来
[山治] 罗宾回答: 知道了,马上
[山治] 第 4 次求救:罗宾快来救我
[罗宾] 我听到第 4 次求救了,马上来
[山治] 罗宾回答: 知道了,马上
[山治] 第 5 次求救:罗宾快来救我
[罗宾] 我听到第 5 次求救了,我到了
[山治] 罗宾你来了!

4 结尾

基础内容看似简单,想要精通也得花不少精力。记录下该文,望日后翻阅,能有醍醐灌顶之功效,哈哈。

更多内容,欢迎关注公众号:Python生活志

收藏
评论区

相关推荐

python多线程原理和详解(一)
python多线程原理和详解 线程概念 1 . 线程是什么? 线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
Python的环境搭建和下载
Python是一个跨平台、可移植的编程语言,因此可在windows、Linux和Mac OS X系统中安装使用。 安装完成后,你会得到Python解释器环境,可以通过终端输入python命令查看本地是否已经按照python以及python版本。这里有一点需要注意的是,如果没有将python的安装目录添加到环境变量中,会报错(python不是内部命令或外部命
python中的异常处理
异常 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下 异常种类   在python中不同的异常可以用不同的类型(python
1. 这才是 Python 学习的正确起手姿势,滚雪球学 Python
在博客上,我写了很多关于 Python 的文章,很多朋友可能觉得橡皮擦应该是一个 Python 开发人员或者一个技术开发人员,但很遗憾的告诉大家,橡皮擦恰好是很多公司中开发人员的对立面【产品经理】。但我是一个相当懂技术人的产品经理。 一、Python 初次接触,Python 变量与基本运算 1.1 滚雪球学 Python 课程前置导语 从本篇博
15. Python 程序运行速度如何提高十倍?第一遍滚雪球学 Python 收工
本篇文章将给大家介绍 Python 多线程与多进程相关知识,学习完该知识点之后,你的 Python 程序将进入另一个高峰。 <center<font colorred缓解一下视疲劳</font</center 15. Python 程序运行速度如何提高十倍?第一遍滚雪球学 Python 收工(https://imghelloworld.oss
python多线程详解
python中的多线程是一个非常重要的知识点,今天为大家对多线程进行详细的说明,代码中的注释有多线程的知识点还有测试用的实例。 码字不易,阅读或复制完了,点个赞! import threading from threading import Lock,Thread import time,os '''
我的python多线程和多进程
线程存在空闲 from multiprocessing.dummy import Poolfrom multiprocessing.dummy import Pool as ThreadPool pool ThreadPool(20) pool.map(job_worker, result_cursor)
【python学习】从海贼王中体会进程、线程和协程
在学习Python的过程中,一种最直接的感触就是上手轻松,但精通很难,很多时候离不开计算机学科的基础知识。比如下面这个问题,我是没法第一时间想到准确答案的。 协程和线程有什么区别?在学习的道路上,看懂听懂是输入,写明说清是输出,只有达到输出这一步才算真正搞懂一个知识点。So,今天就先搞搞这个问题,用海贼王的故事来理解个中差异。协程、
Python编程基础(快速入门必看
Python编程基础一、Python语言基本语法 Python是一
Python初学者必备书籍《Python入门经典》高清PDF版|百度网盘免费下载|Python初学者,自学Python必读
提取码:1028以及前文提到的学习路线图内容简介Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python可以用于很多的领域,从科学计算到游戏开发。《Python入门经典》是面向Python初学者的学习指南,详细介绍了Python编程基础,以及一些高级概念,如面向对象编程。全书分为24章。第1章介绍了Python的背景和安装方法。第2章
流畅的pythonPDF高清版
提取码:1028内容简介 · · · · · ·【技术大咖推荐】“很荣幸担任这本优秀图书的技术审校。这本书能帮助很多中级Python程序员掌握这门语言,我也从中学到了相当多的知识!”——Alex Martelli,Python软件基金会成员“对于想要扩充知识的中级和高级Python程序员来说,这本书是充满了实用编程技巧的宝藏。”——Daniel Greenf
关于学习python的一点意见分享
Python适合初学者入门。Python作为一门叫做ABC语言的替代品。 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。相比其他主流语言,有更好的可读性,上手相对容易。各种模块,免去了很多重复的工作,更快地写出东西。配置环境也不复杂,mac和linux内置了Python。自学python,最大的3个经验:.一本易懂,比较好的教程,从头到尾
全网最全python学习路线图,让学习不迷路
学习Python有一段时间了,最近也是在不断的整理Python相关的基础知识和学习一些新的知识,想来分享给大家。我刚开始接触Python时,和大多数初学者一样不知道从那里开始学习python,我也在网上找了许多python相关的资料来学习,但是资料多也不见得就好,因为不知道从哪里开始下手,走了许多弯路。后面我就整理了一套对初学者来说学习python能很快上手
一篇文章带你解析Python进程
前言进程,一个新鲜的字眼,可能有些人并不了解,它是系统某个运行程序的载体,这个程序可以有单个或者多个进程,一般来说,进程是通过系统CPU 内核数来分配并设置的,我们可以来看下系统中的进程:可以看到,360浏览器是真的皮,这么多进程啊,当然可以这样来十分清楚的看进程线程使用情况: 通过任务管理器中的资源监视器,是不是很厉害了,哈哈哈。讲完了这些,再说说用法。
建议收藏,22个Python迷你项目(附源码)
在使用Python的过程中,我最喜欢的就是Python的各种第三方库,能够完成很多操作。 下面就给大家介绍22个通过Python构建的项目,以此来学习Python编程。 大家也可根据项目的目的及提示,自己构建解决方法,提高编程水平。 ① 骰子模拟器 目的:创建一个程序来模拟掷骰子。 提示:当用户询问时,使用random模块生成一个1到6之间

热门文章

最新文章