python进程线程及协程对比

2020-08-24  本文已影响0人  _karen

多任务:同一时间执行多个任务

表现:

进程

概念
资源分配的最小单位,是操作系统进行资源分配和调度运行的基本单位
会分配CPU、内存、磁盘、网路等资源
进程的三种基本状态
就绪状态
执行状态
阻塞状态
在一些系统中,进程还有一种很重要的状态是:挂起状态(是该进程暂时不接受调度)
另外,在实际系统中,为管理需要,还存在着两种比较常见的状态:创建状态和终止状态
多进程的作用
提高程序执行效率
多进程完成多任务实战

import multiprocessing
from time import sleep
import os

# 函数定义
def sing(num):
    # 获取进程编号
    print("唱歌进程的编号是:",os.getpid())
    for i in range(num):
        print("第 {0} 次唱歌".format(i))
        sleep(1)
def dance(num):
    # 获取进程编号
    print("跳舞进程的编号是:{0}".format(os.getpid()))
    for i in range(num):
        print("第 {0} 次跳舞".format(i))
        sleep(1)
if __name__ == '__main__':
    # group=None, target=None, name=None
    # target 执行的目标任务名,一般是函数名或者方法名
    # name 进程名字,一般不设置,系统会自动设置,process-1  -2等
    # group=None 进程组
    # args = (), 表示以元组方式传参,逗号不可以省略,元组的元素顺序与函数中的形参要顺序一致
    # kwargs = {} 表示以字典方式传参 字典的键与参数名称相同,多个参数只要保证key与形参名称一致即可

    # 主进程创建子进程 注意函数名没有引号,没有括号

    sing_progress = multiprocessing.Process(target=sing,args=(5,))
    dance_progress = multiprocessing.Process(target=dance,kwargs={"num":3})

    # 将子进程设置成守护进程,一旦主进程结束,所有的子进程都会自动销毁掉
    sing_progress.daemon = True

    # 启动进程
    sing_progress.start()
    dance_progress.start()

多线程任务实战

import threading
from time import sleep
import os

# 函数定义
def sing():
    for i in range(3):
        print("第 {0} 次唱歌".format(i))
        sleep(1)
def dance():
    # 获取进程编号
    # print("跳舞进程的编号是:{0}".format(os.getpid()))
    for i in range(3):
        print("第 {0} 次跳舞".format(i))
        sleep(1)
def task():
    sleep(1)
    info = threading.current_thread()
    print("第{0}个线程的线程信息".format(info))
if __name__ == '__main__':
    # group=None, target=None, name=None
    # target 执行的目标任务名,一般是函数名或者方法名
    # name 进程名字,一般不设置,系统会自动设置 thread-1  -2等
    # group=None
    # args = (), 表示以元组方式传参,逗号不可以省略,元组的元素顺序与函数中的形参要顺序一致
    # kwargs = {} 表示以字典方式传参 字典的键与参数名称相同,多个参数只要保证key与形参名称一致即可
    # daemon 是否设置为守护线程
    # sing_thread = threading.Thread(target=sing)
    # dance_thread = threading.Thread(target=dance,daemon=True)
    #
    # # 一定要在start之前调用
    # sing_thread.setDaemon(True)
    # sing_thread.start()
    # dance_thread.start()

    for i in range(10):
        t = threading.Thread(target=task)
        t.start()

协程实战

# 真正的协程模块就是使用greenlet完成的切换
from greenlet import greenlet

def eat(name):
    print('%s eat 1' % name)  # 2
    g2.switch('taibai')  # 3
    print('%s eat 2' % name)  # 6
    g2.switch()  # 7

def play(name):
    print('%s play 1' % name)  # 4
    g1.switch()  # 5
    print('%s play 2' % name)  # 8

g1 = greenlet(eat)
g2 = greenlet(play)

g1.switch('taibai')  # 可以在第一次switch时传入参数,以后都不需要  #1
上一篇 下一篇

猜你喜欢

热点阅读