美文网首页进击的Python生活不易 我用python程序员
Python3简单实现多任务(线程/协程篇)

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

作者: zhaoolee | 来源:发表于2017-08-10 22:55 被阅读494次

写在前面

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

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

小结

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

相关文章

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

    写在前面 上一篇文章[Python3简单实现多任务(多进程篇)]已经介绍了python多进程实现多任务的简单实现方...

  • 4-7

    协程 协程,又称微线程,纤程。英文名Coroutine。 协程是啥 协程是python个中另外一种实现多任务的方式...

  • 协程

    协程 协程,又称微线程,纤程。英文名Coroutine。 协程是啥 协程是python个中另外一种实现多任务的方式...

  • 协程——yield

    协程: 协程,又称微线程,纤程。英文名Coroutine。 协程是python个中另外一种实现多任务的方式,只不过...

  • 协程

    协程 协程,又称微线程,纤程。英文名Coroutine。 协程是python个中另外一种实现多任务的方式,只不过比...

  • Python多任务-协程

    协程 协程,又称微线程,纤程。英文名Coroutine。 协程是python个中另外一种实现多任务的方式,只不过比...

  • 多任务-协程

    一、协程的概念 协程,又称微线程,纤程。英文名Coroutine。协程是python中另外一种实现多任务的方式,只...

  • 协程-yield

    协程,又称微线程,纤程。英文名Coroutine。 协程是啥 协程是python个中另外一种实现多任务的方式,只不...

  • 网络爬虫:多任务-进程、线程

    实现多任务的方式 多线程多进程协程多线程+多进程 为什么你能够实现多任务? 并行:同时发起,同时执行,多进程,进程...

  • 协程-yield

    携程协程,又称微线程,纤程。英文名Coroutine。 协程是python个中另外一种实现多任务的方式,只不过比线...

网友评论

本文标题:Python3简单实现多任务(线程/协程篇)

本文链接:https://www.haomeiwen.com/subject/zkukrxtx.html