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#难点逐个击破(5):类的访问类型

    C#中类的访问类型是指定义在类里面的成员被访问的可见性,与类的作用域有关。C#中的访问类型分为四种:public、private、protected、internal。以下是这四种访问类型的详细说明: public public是最常用的访问类型,声明为public的成员可以在任何类中访问。下面是一个示例: public class Example1 { p…

    C# 2023年6月1日
    00
  • c# JSON返回格式的WEB SERVICE

    下面是详细讲解“c# JSON返回格式的WEB SERVICE”的攻略。 简介 在使用web service进行跨语言通信时,由于各种语言对数据格式的要求不同,我们需要一种通用的数据格式来实现通信,而 JSON 就是一种通用的数据格式。C# JSON返回格式的WEB SERVICE可以将数据以 JSON 格式返回,方便与其他编程语言进行数据交互。下面我们来看…

    C# 2023年5月31日
    00
  • ASP.NET Core Kestrel 中使用 HTTPS (SSL)

    在 ASP.NET Core 中,可以使用 Kestrel 服务器来启用 HTTPS(SSL)协议。以下是 ASP.NET Core Kestrel 中使用 HTTPS 的完整攻略: 步骤一:创建证书 在使用 HTTPS 之前,需要创建一个证书。可以使用 OpenSSL 工具或者 Windows PowerShell 命令来创建证书。以下是使用 OpenSS…

    C# 2023年5月17日
    00
  • Sitecore XP 10.3(latest) Docker一键部署

    本文演示通过PowerShell+Docker Desktop for Windows 一键部署Sitecore10.3(即Sitecore最新版)Docker开发/测试/演示 环境。 官方参考 SitecoreXP 10.3.0 Developer Workstation Deployment With Docker 演示配置为XP Single(XP0)…

    C# 2023年4月30日
    00
  • Xamarin.Forms在安卓机上进行本机调试

    下面是“Xamarin.Forms在安卓机上进行本机调试”的完整攻略: 步骤一:启用安卓机的开发者模式 在安卓机上启用开发者模式的具体步骤会因不同的 Android 版本而略有不同,一般这个选项位于“设置”应用的“关于手机”或“系统”菜单中。具体可以下载一些 Android 开发相关的文档查阅,这里不再赘述。 步骤二:使用电脑连接安卓机 将安卓机通过 USB…

    C# 2023年6月3日
    00
  • C#: 引用变量与数值变量的区别

    C#中变量分为引用变量和数值变量,它们的区别在于它们的存储方式和数据类型。 引用变量和数值变量的概念 引用变量指的是具有内存地址的变量,该变量存储的是对象在内存中的地址。引用变量指向对象存储在堆内存中的地址而不是实际的值。当程序使用引用变量时,实际上是通过内存地址来操作堆中的对象。引用变量主要用于引用类型数据,如类、接口、委托等。 数值变量指的是实际的数值,…

    C# 2023年6月7日
    00
  • C#实现Windows服务测试与调试

    实现C#的Windows服务测试与调试需要经过以下几个步骤: 步骤一:创建Windows服务 首先,在Visual Studio中创建新的Windows服务项目。在项目中添加服务代码,可以在服务启动时执行一些初始化操作,在服务停止时执行一些清理操作。在服务代码中实现一个可以运行的方法,该方法将在代表Windows服务的类的OnStart方法中调用。 步骤二:…

    C# 2023年6月1日
    00
  • 深入分析缓存依赖中cachedependency对象及周边小讲

    深入分析缓存依赖中 Cachedependency 对象及周边小讲 什么是缓存依赖 缓存依赖是 ASP.NET 缓存技术中的一个概念,用于实现缓存与数据源的自动同步、自动更新。具体来说,缓存依赖是一种机制,当特定的条件成立时,会自动使缓存变得无效,以便下一次访问时可以从数据源重新获取数据。通过使用缓存依赖,我们可以避免缓存与数据源不一致的问题,提高应用程序的…

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