python简单线程和协程学习心得(分享)

Python简单线程和协程学习心得

线程和协程的区别

线程是操作系统的调度单位,是由操作系统来进行线程调度,每个线程拥有自己的内存空间,一个线程会包含多个任务的处理过程,可以实现同时执行多个任务的效果。

而协程则是在用户程序中自行切换的,每个协程之间并不存在系统线程之间的上下文切换开销,协程是一种轻量级的线程,可以在同一个线程中运行,不会让操作系统进行线程上下文的切换,且共享内存,数据通信更加方便。协程的运行结果就是协程本身,协程需要一个主函数来驱动调度协程。

Python线程

Python原生的线程支持库是_thread,而更加高级的线程支持库有threading和concurrent.futures等。threading提供了Lock、Condition、Semaphore、Event、Barrier等线程同步和通信机制,支持线程的守护和线程池管理。concurrent.futures提供了更加简单易用的线程池实现,并支持并行执行任务结果的回收。

以下是使用threading实现简单线程的示例代码:

import threading
import time

def worker(num):
    print('Thread %s started!' %num)
    time.sleep(1)
    print('Thread %s finished!' %num)

if __name__ == '__main__':
    threads = []
    for i in range(5):
        t = threading.Thread(target=worker, args=(i,))
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

    print('All threads finished!')

执行结果:

Thread 0 started!
Thread 1 started!
Thread 2 started!
Thread 3 started!
Thread 4 started!
Thread 0 finished!
Thread 2 finished!
Thread 1 finished!
Thread 3 finished!
Thread 4 finished!
All threads finished!

Python协程

Python的协程实现主要依赖于generator来实现,使用yield实现在协程中切换执行,进而实现异步调用和非首次调用的接口。

以下是使用yield实现简单的协程的示例代码:

def coroutine():
    subgen = subcoroutine()
    while True:
        try:
            subgen.send(None)
        except StopIteration:
            break

def subcoroutine():
    while True:
        event = yield
        print('Event:', event)

if __name__ == '__main__':
    c = coroutine()
    c.send(None)
    c.send('message 1')
    c.send('message 2')
    c.send('message 3')

执行结果:

Event: message 1
Event: message 2
Event: message 3

以上示例中,subcoroutine()方法只是一个生成器函数,不能被单独调用,coroutine()方法是调用方,将生成器函数subcoroutine()调用并在协程中执行。执行时,coroutine()方法将subcoroutine()函数调度进入协程中,并反复循环调用其返回值,直到subcoroutine()函数执行完成。只有当事件event被send执行后,才会继续执行subcoroutine()方法的yield后面的代码,而event的输出则由subcoroutine()实现。

结语

以上对Python简单线程和协程的学习心得的简介,希望能为大家提供一些帮助。如有错误或疏漏,欢迎指正。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python简单线程和协程学习心得(分享) - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • 使用C#编写简单的图形化的可发送附件的邮件客户端程序

    使用C#编写简单的图形化的可发送附件的邮件客户端程序,可以分为以下几个步骤: 步骤1:创建C#窗体应用程序 首先,打开Visual Studio,选择创建新项目,选择Windows Forms应用程序,命名为“EmailClient”,点击创建。 步骤2:添加控件 在设计视图中,选中工具箱中的各种控件,拖拽放置在窗体中进行布局设计。要实现附件发送,需要添加三…

    C# 2023年6月7日
    00
  • C#将Json解析成DateTable的方法

    将JSON解析成DataTable是C#中常见的需求,可用于将接口返回的JSON数据进行转换,以便于在程序中进行进一步处理。以下是将JSON解析成DataTable的步骤介绍: 步骤一:引用Newtonsoft.Json库 首先,需要在项目中引入Newtonsoft.Json库。可通过NuGet或手动导入方式进行添加,具体方式如下: NuGet方式: 在Vi…

    C# 2023年5月31日
    00
  • 基于C#实现的HOOK键盘钩子实例代码

    下面我将为你详细讲解如何基于C#实现HOOK键盘钩子实例代码。 1. 了解HOOK键盘钩子 首先,我们要了解一下HOOK键盘钩子。HOOK钩子是一种实现事件过滤或拦截的机制。HOOK键盘钩子可以用于捕获用户键盘操作。通过HOOK键盘钩子,我们可以在用户按下键盘时获取并处理这些按键信息。 2. 实现HOOK键盘钩子 接下来,我们将实现HOOK键盘钩子,以获取用…

    C# 2023年6月7日
    00
  • Erlang实现的百度云推送Android服务端实例

    下面我将为您详细讲解“Erlang实现的百度云推送Android服务端实例”的完整攻略。 简介 百度云推送是一款高速、免费、稳定的消息推送服务,可支持Android、iOS、PC、Web等多设备提供消息推送服务。本文将介绍如何使用Erlang实现百度云推送服务的Android端。 准备工作 在开始使用Erlang实现百度云推送服务之前,您需要先完成以下准备工…

    C# 2023年6月3日
    00
  • 使用typescript改造koa开发框架的实现

    使用Typescript改造Koa开发框架的实现可以带来更好的可维护性和可读性。下面是一些完整的攻略: 步骤一:安装依赖 全局安装TypeScript npm install -g typescript 安装所需的依赖 npm install –save-dev @types/koa @types/node koa koa-router typescrip…

    C# 2023年6月3日
    00
  • C#读写config配置文件的方法

    以下是关于C#读写config配置文件的完整攻略。 1. 创建配置文件 首先,我们需要创建一个配置文件,可以使用Visual Studio自带的配置管理器创建,也可以手动创建一个XML文件并修改后缀为.config。下面是一个简单的配置文件示例: <?xml version="1.0" encoding="utf-8&qu…

    C# 2023年6月1日
    00
  • C#实现一个简单实用的TXT文本操作及日志框架详解

    C#实现一个简单实用的TXT文本操作及日志框架详解 在C#开发中,文本操作是非常常见的需求,而日志框架则是为了记录程序执行过程中的关键数据和错误信息等,方便开发者进行问题定位和排查。本文将详细讲解如何使用C#实现一个简单实用的TXT文本操作及日志框架。 实现TXT文本操作 实现TXT文本操作需要使用到C#的System.IO命名空间下的File类和Strea…

    C# 2023年5月15日
    00
  • Entity Framework使用Code First的实体继承模式

    下面我来详细讲解“Entity Framework使用Code First的实体继承模式”的完整攻略。 1. 实体继承模式概述 实体继承模式是指,在EF中,可以让一个实体从另一个实体继承,而不是从零开始创建一个新实体。这个新实体将继承另一个实体的所有属性、方法和字段,可以重写父实体的属性和方法,从而实现对实体模型的复用。 实体继承的方式有三种:表继承、TPH…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部