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

二进制打工人 等级 750 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生活志

收藏
评论区

相关推荐

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入门经典》高清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相关的基础知识和学习一些新的知识,想来分享给大家。我刚开始接触Python时,和大多数初学者一样不知道从那里开始学习python,我也在网上找了许多python相关的资料来学习,但是资料多也不见得就好,因为不知道从哪里开始下手,走了许多弯路。后面我就整理了一套对初学者来说学习python能很快上手
建议收藏,22个Python迷你项目(附源码)
在使用Python的过程中,我最喜欢的就是Python的各种第三方库,能够完成很多操作。 下面就给大家介绍22个通过Python构建的项目,以此来学习Python编程。 大家也可根据项目的目的及提示,自己构建解决方法,提高编程水平。 ① 骰子模拟器 目的:创建一个程序来模拟掷骰子。 提示:当用户询问时,使用random模块生成一个1到6之间
NumPy的详细教程
先决条件 ---- 在阅读这个教程之前,你多少需要知道点python。如果你想从新回忆下,请看看[Python Tutorial](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fdocs.python.org%2Ftut%2F). 如果你想要运行教程中的示例,你至少需要在你的电脑上安装了
Day01——Python简介
**一、Python简介** python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的**脚本解释程序**,作为ABC语言的一种继承,Python通过C语言开发。 TIOBE开发语言排名(2018-01-17),**python排名第四** https:/
Gevent简明教程
1、前述 ---- ### 进程 线程 协程 异步 并发编程(不是并行)目前有四种方式:多进程、多线程、协程和异步。 * 多进程编程在python中有类似C的os.fork,更高层封装的有multiprocessing标准库 * 多线程编程python中有Thread和threading * 异步编程在linux下主+要有三种实现selec
Python 3 教程
Python 3 教程 =========== ![python3](https://www.runoob.com/wp-content/uploads/2014/05/python3.png) Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,
Python 基础知识(一)
### 1.Python简介 #### 1.1、Python介绍          python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。   (龟叔:2005年加入谷歌至2012年,2013年加
Python 多进程程批量爬取小
使用python多进程跑同样的代码。 python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到**并发执行**的转换。multiproc
Python 并行分布式框架之 PP
PP ([Parallel Python](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fwww.parallelpython.com%2F))是基于Python的一个轻量级的,提供在SMP(多处理器或者多核系统)或者集群环境中并行执行Python代码的机制。 最简单和最常见的并行方式
Python 环境搭建
#python bug集 #目录 \[toc\] ##00 python 模块下载地址 [pyhton模块下载地址](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fwww.lfd.uci.edu%2F%7Egohlke%2Fpythonlibs%2F) ##01 python pip
Python爬虫人工智能大数据全栈视频史上最全合辑教程分享!
Python爬虫人工智能大数据全栈视频史上最全合辑教程分享! ============================== 毫无疑问Python是这两年最火的编程语言,不仅容易上手,且在多个行业都可应用。尤其今年人工智能及大数据的发展,Python将会展现更多的实用性! 如果你是小白想改变自己的职业方向,抓紧时间上车…精心整理的资料和课程都在下面! P

热门文章

最新文章