Python3简单实现多任务(线程/协程篇)线程多任务实现1:直接使用Thread创建线程线程多任务实现2:定义类继承threading.Thread,然后重写run方法(run方法相当于功能函数)协

写在前面

  • 上一篇文章[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

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()

小结

  • 线程与进程相比,占用资源更少,但线程依赖于进程,一个进程可以有多个线程,进程完成任务依赖于内部的线程;
  • 协程解决了线程之间争用资源引发的资源浪费,所以协程比线程占用的资源更少.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张戈的专栏

Nginx发布1.9.0版本,新增支持TCP代理和负载均衡的stream模块

昨天在公司微信群,CTO 分享了这个消息,对运维来说以后基于 TCP 协议的后端业务的高可用又多了一个新的选择,实在是棒极了! 一直以来,Nginx 并不支持 ...

3065
来自专栏沃趣科技

Oracle压缩黑科技(二)—压缩数据的修改

原文链接 https://www.red-gate.com/simple-talk/sql/oracle/compression-in-oracle-part-...

2816
来自专栏惨绿少年

MongoDB 分片集群技术

---- 在了解分片集群之前,务必要先了解复制集技术! ----  1.1 MongoDB复制集简介   一组Mongodb复制集,就是一组mongod进程,...

5269
来自专栏黑白安全

WEB访问日志自动化分析浅谈

最近经常需要分析WEB访问日志,从中发现非法请求,然后做相应安全检查,为了方便,所以写了一个日志分析平台,支持提交iis,apapche,tomcat,ngni...

1602
来自专栏数据和云

Oracle 12.2新特性掌上手册 - 第二卷 In-Memory增强

编辑手记: In-Memory 是 Oracle 在 12.1.0.2 中引入的新特性,旨在加速分析型 SQL 的速度。传统的 OLTP 应用通过 buffer...

2935
来自专栏机器学习从入门到成神

2013百度校招笔试真题以及解析(内存管理及其优缺点总结)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

1331
来自专栏marsggbo

Pytorch windows10安装教程

强烈建议安装anaconda之后再来安装这个pytorch,具体怎么安装百度搜索就知道了。 温馨提示,在安装anaconda的时候记得将“添加到环境变量”(安...

31910
来自专栏北京马哥教育

4个Linux服务器监控工具

下面是我想呈现给你的4个强大的监控工具。 htop – 交互式进程查看器 你可能知道在机器上查看实时进程的标准工具top。如果不知道,请运行$ top看看,运行...

4339
来自专栏数据和云

YH2:In-Memory知识库

In-Memory 是 Oracle 在 12.1.0.2 中引入的新特性,旨在加速分析型 SQL 的速度。传统的 OLTP 应用通过 buffer cache...

3444
来自专栏Jerry的SAP技术分享

Chrome开发者工具关于网络请求的一个隐藏技能

这个隐藏技能的背景是,最近出于学习目的,我写了一个百度贴吧的网络爬虫,专门爬取一些指定主题的贴吧帖子。

1421

扫码关注云+社区

领取腾讯云代金券