12-Python之路-进阶-多任务

2022-05-01  本文已影响0人  程序记录日志

多任务:线程

多任务:简介

线程:简介

threading 模块

线程:语法

import threading
t = threading.Thread(target="函数名")
t.start()

查看线程数量

线程执行代码的封装

线程的执行顺序

共享全局变量

多线程开发问题

互斥锁

互斥锁:语法
# 创建锁
mutex = threading.Lock()

# 锁定
mutext.acquire()

# 释放
mutex.release()

上锁解锁过程
优缺点
死锁
避免死锁

GIL

多任务:进程

进程:简介

进程 :状态

multiprocessing 模块

语法

from multiprocessiong import Process
p = Process(target="函数名")
p.start()

Process

Process([group[,name[,args[,kwargs]]]]) 参数
Process 常用方法
Process 常用属性
Process获取进程号

进程间通信

Queue

方法

进程池

multiprocessing.Pool 常用函数

多任务:协程

协程:简介

简单实现协程

import time

def work1():
    while True:
        print("-------work1------")
        yield
        time.sleep(0.5)
def work2():
    while True():
        print("--------work2------")
        yield
        time.sleep(0.5)
def main():
    w1 = work1()
    w2 = work2()
    while True:
        next(w1)
        next(w2)

if __name__ == '__main__':
    main()

greenlet

安装:greenlet

sudo pip3 install greenlet

greenlet简单实现

from greenlet import greenlet
import time

def test1():
    while True:
        print("----------A------------")
        gr2.switch()
        time.sleep(0.5)

def test2():
    while True:
        print("---------------B-----------")
        gr1.switch()
        time.sleep(0.5)

gr1 = greenlet(test1)
gr2 = greenlet(test2)

# 切换到gr1中运行
gr1.switch()

gevent

gevent: 安装

pip3 install gevent

gevent:简单实现

import gevent
def f(n):
    for i in range(n):
        print(gevent.getcurrent(),i)
g1 = gevent.spawn(f,5)
g2 = gevent.spawn(f,5)
g3 = gevent.spawn(f,5)
g1.join()
g2.join()
g3.join()

Monkey给程序打补丁

from gevent import monkey
import gevent
import random
import time

# 有耗时操作时,需要将程序用到的耗时操作代码,换成gevent中自己实现的模块
monkey.patch_all()
def coroutine_work(coroutime_name):
    for i in range(10):
        print(coroutime_name,i)
        time.sleep(random.random())
gevent.joinall([
    gevent.spawn(coroutine_work,"work1"),
    gevent.spawn(coroutine_work,"work2")
    ])

线程和线程

迭代

可迭代对象

可迭代对象的本质

for ...in...循环的本质

生成器

生成器:简介

创建生成器

A = [x*2 for in range(5)]       # 列表生成式
B = (x*2 for in range(5))       # 
next(B)         # 使用

生成器实现斐波那切数列

def fib(n):
    current = 0
    num1,num2 = 0 , 1
    while current < n:
        num = num1
        num1,num2 = num2,num1+num2
        current += 1
        yield num
    return 'done'

使用生成器

    for n in fib(5):
        print(n)

捕获生成器错误

    g = fib(5)
    while True:
        try:
            x = next(g)
            print("value:%d"%x)
        except StopIteration as Stop:
            print("生成器返回值:%s"%Stop.value)
            break

send唤醒

使用send

def gen():
    i = 0
    while i<5:
        temp = yield i 
        print(temp)
        i += 1

f =gen()
f.send("附加数据")

进程、线程、协程对比

上一篇下一篇

猜你喜欢

热点阅读