Python3简单实现多任务(线程/协程篇)

简介: 写在前面上一篇文章[Python3简单实现多任务(多进程篇)]已经介绍了python多进程实现多任务的简单实现方法;这次讲一讲python创建多任务另外两种常见的方式:协程和线程线程多任务实现1:直接使用Thread创建线程...

写在前面

  • 上一篇文章[Python3简单实现多任务(多进程篇)]已经介绍了python多进程实现多任务的简单实现方法;
  • 这次讲一讲python创建多任务另外两种常见的方式:
  • 协程和线程


线程多任务实现1:直接使用Thread创建线程

from threading import Thread
import threading
import os
import time
import random

def not_know(thread_num):
    
    print("第%d线程吟唱:不知天上宫阙"%(thread_num))
    time.sleep(random.random())
    print("第%d线程吟唱:今夕是何年"%(thread_num))
    time.sleep(random.random())
    print("第%d号线程:<吟唱古诗>任务结束..."%(thread_num))

def main():
    for i in range(1, 6):
        num = len(threading.enumerate())
        print("当前线程数为:%d"%num)
        t = Thread(target=not_know, args=(i,))
        t.start()
        time.sleep(0.8)

if __name__ == "__main__":
    print("--->主函数开始运行<---")
    main()
    print("--->主函数运行完毕<---")

线程多任务实现2:定义类继承threading.Thread,然后重写run方法(run方法相当于功能函数)

from threading import Thread
import threading
import os
import random
import time

class the_cosmetic(threading.Thread):
    def __init__(self, num):
        self.num = num
        # 一定要记得调用父类构造方法
        threading.Thread.__init__(self)

    def run(self):
        print("-->第%d线程开始执行<--"%self.num)
        time.sleep(random.random())
        print("%d最有效的化妆品是什么?"%self.num)
        time.sleep(random.random())
        print("%dPhotoshop是最好的化妆品!"%self.num)
        time.sleep(random.random())
        print("-->第%d线程执行完毕<--"%self.num)

def main():
    print("-------->开始创建线程<--------")

    for i in range(1, 6):
        t = the_cosmetic(i)
        t.start()

    print("-------->线程创建完毕<--------")

if __name__ == "__main__":
    main()

协程多任务实现1:gevent(使用简单,推荐!需要pip安装gevent)

sudo pip3 install gevent

1240
import time
import random
import gevent
from gevent import monkey

monkey.patch_all()

def peach(name):
    for i in range(1, 6):
        start_time = time.time()
        time.sleep(random.random())
        end_time = time.time()
        # 使用 round() 控制小数点位数!
        print("%s产出第%s个桃子,耗时%s"%(name, i, round(end_time - start_time, 2)))

def apple(name):
    for i in range(1, 8):
        start_time = time.time()
        time.sleep(random.random())
        end_time = time.time()
        print("%s产出第%s个苹果,耗时%s"%(name, i, round(end_time - start_time, 2)))

def main():
    # 注意:下面的语句,没有等号! 没有等号! 没有等号!
    gevent.joinall([
        gevent.spawn(peach,"LI"),
        gevent.spawn(apple,"HO"),
        ])

if __name__ == "__main__":
    main()

协程多任务实现2:yield实现协程(yield最底层,最灵活,是python自带的模块)

import time

def to_activate():
    yield
    print("吃早饭")
    print("读文档")
    yield
    print("吃中午饭")
    print("写程序")
    yield
    print("吃晚饭")
    print("解bug")

def to_sleep():
    yield
    print("午睡")
    yield
    print("晚休")

def main():
    print("程序员的一天")
    activate = to_activate()
    sleep = to_sleep()

    # 利用yield开始在两个函数间跳转
    next(activate)
    next(sleep)
    next(activate)
    next(sleep)
    next(activate)

    print("程序员的一天结束了")



if __name__ == "__main__":
    main()


协程多任务实现3:greenlet实现协程(模块须通过pip单独安装,个人感觉这个模块封装的并不够好,所以放到最后,仅供了解)

sudo pip3 install greenlet


import time
from greenlet import greenlet

activate = None
sleep = None

def to_activate():
    print("吃早饭")
    print("读文档")
    sleep.switch()
    print("吃中午饭")
    print("写程序")
    print("吃晚饭")
    print("解bug")

def to_sleep():
    print("午睡")
    activate.switch()
    print("晚休")

def main():
    global activate
    global sleep
    print("程序员的一天")
    activate = greenlet(to_activate)
    sleep = greenlet(to_sleep)

    #从activate开始执行
    activate.switch()
    print("程序员的一天结束了")



if __name__ == "__main__":
    main()

小结

  • 线程与进程相比,占用资源更少,但线程依赖于进程,一个进程可以有多个线程,进程完成任务依赖于内部的线程;
  • 协程解决了线程之间争用资源引发的资源浪费,所以协程比线程占用的资源更少.
目录
相关文章
|
12天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
22天前
|
算法 数据处理 Python
Python并发编程:解密异步IO与多线程
本文将深入探讨Python中的并发编程技术,重点介绍异步IO和多线程两种常见的并发模型。通过对比它们的特点、适用场景和实现方式,帮助读者更好地理解并发编程的核心概念,并掌握在不同场景下选择合适的并发模型的方法。
|
6天前
|
调度 Python
Python多线程、多进程与协程面试题解析
【4月更文挑战第14天】Python并发编程涉及多线程、多进程和协程。面试中,对这些概念的理解和应用是评估候选人的重要标准。本文介绍了它们的基础知识、常见问题和应对策略。多线程在同一进程中并发执行,多进程通过进程间通信实现并发,协程则使用`asyncio`进行轻量级线程控制。面试常遇到的问题包括并发并行混淆、GIL影响多线程性能、进程间通信不当和协程异步IO理解不清。要掌握并发模型,需明确其适用场景,理解GIL、进程间通信和协程调度机制。
22 0
|
21天前
|
数据采集 Java API
python并发编程: Python使用线程池在Web服务中实现加速
python并发编程: Python使用线程池在Web服务中实现加速
18 3
python并发编程: Python使用线程池在Web服务中实现加速
|
24天前
|
Java 测试技术 Python
Python开启线程和线程池的方法
Python开启线程和线程池的方法
17 0
Python开启线程和线程池的方法
|
29天前
|
并行计算 Python
Python中的并发编程:多线程与多进程的比较
在Python编程中,实现并发操作是提升程序性能的重要手段之一。本文将探讨Python中的多线程与多进程两种并发编程方式的优劣及适用场景,帮助读者更好地选择合适的方法来提高程序运行效率。
|
13天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
25天前
|
存储 缓存 NoSQL
Redis单线程已经很快了6.0引入多线程
Redis单线程已经很快了6.0引入多线程
31 3
|
27天前
|
消息中间件 安全 Linux
线程同步与IPC:单进程多线程环境下的选择与权衡
线程同步与IPC:单进程多线程环境下的选择与权衡
57 0
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结

热门文章

最新文章