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#中,多线程处理多个数据是一种常见的需求,本文将详细介绍如何使用C#实现多线程处理多个数据的方法,包括代码实现和注意事项等。 方法一:使用Task类 在C#中,我们可以使用Task类来实现多线程处理多个数据。以下是一个简单的示例代码: using System; using System.Threading.Tasks; class Program { …

    C# 2023年5月15日
    00
  • WPF如何自定义TabControl控件样式示例详解

    下面是针对“WPF如何自定义TabControl控件样式示例详解”的攻略: 一、介绍 TabControl是很常用的WPF控件之一,用于在多个标签页中显示不同的内容。虽然TabControl自带的样式可以满足一般的需求,但有时候我们会想自定义TabControl的外观来符合特定的界面设计。本文将着重讲解如何自定义TabControl控件样式。 二、预备知识 …

    C# 2023年6月6日
    00
  • C#实现将商品金额小写转换成大写的方法

    下面是详细讲解“C#实现将商品金额小写转换成大写的方法”的完整攻略: 简介 在开发商业应用时,我们经常需要将商品金额从小写转换为大写,以便在发票、收据、合同等文档中使用。C#语言提供了简便的方式来实现这个功能。 实现方法 利用 .NET Framework 的内置库可以轻松地将小写金额转换为大写金额。可以使用以下方法来实现。 public static st…

    C# 2023年6月8日
    00
  • c#创建浮动工具栏功能示例

    下面是关于“c#创建浮动工具栏功能示例”的完整攻略: 1. 理解浮动工具栏 浮动工具栏指的是一类在应用程序中可以自由移动的控件集合。在 C# 语言中,我们可以使用菜单和工具栏的组合来实现浮动工具栏的功能。 在实现浮动工具栏前,我们需要做以下准备工作: 在代码中创建菜单栏和工具栏,并设置相应的点击事件程序; 构建浮动工具栏并将其放置在应用程序窗口中。 下面,我…

    C# 2023年6月3日
    00
  • C#中WPF内存回收与释放LierdaCracker的实现

    C#中WPF内存回收与释放LierdaCracker的实现 在C# WPF应用程序中使用LierdaCracker实现内存回收和释放是非常重要的。下面将详细讲解如何实现这一过程。 为什么需要内存回收和释放 随着应用程序的运行,许多对象和资源被创建和使用。这些对象和资源需要被及时回收和释放,以确保应用程序占用的内存空间不会增长到无法控制的程度。内存回收和释放可…

    C# 2023年6月6日
    00
  • 基于C#实现一个最简单的HTTP服务器实例

    基于C#实现一个最简单的HTTP服务器实例 介绍 HTTP服务器通常用于向客户端提供Web应用程序或网站的内容。本教程将演示如何使用C#构建一个最简单的HTTP服务器实例。 步骤 第一步:创建一个新的C#控制台应用程序 首先,打开Visual Studio并创建一个新的C#控制台应用程序。 第二步:创建HTTPServer类 我们需要创建一个名为HTTPSe…

    C# 2023年6月7日
    00
  • Java,C#使用二进制序列化、反序列化操作数据

    Java、C#使用二进制序列化、反序列化操作数据 在Java和C#中,我们可以使用二进制序列化和反序列化来存储和读取对象数据。二进制序列化就是将对象转化为二进制字节流的过程,反序列化则是将二进制字节流转化为对象的过程。在网络传输或者本地存储中,使用二进制序列化和反序列化可以方便的进行数据传输和存储。 Java操作示例 序列化 使用Java中的ObjectOu…

    C# 2023年6月6日
    00
  • .net core使用redis基于StackExchange.Redis

    在本文中,我们将详细讲解如何在.NET Core中使用Redis基于StackExchange.Redis,并提供两个示例说明。 准备工作 在开始之前,您需要安装以下软件: .NET Core SDK Redis 安装StackExchange.Redis 在.NET Core项目中添加StackExchange.Redis NuGet包。 dotnet a…

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