首页 > 编程语言 > 详细

多线程多进程和异步

时间:2021-02-14 09:48:18      阅读:33      评论:0      收藏:0      [点我收藏+]

进程的创建模块--multipocessing

进程的相关方法

函数名 介绍 参数 返回值
Process 创建一个进程 target,args 进程对象
start 执行进程
join 阻塞进程
kill 杀死进程
is_alive 进程是否存活 bool
# 示例
import multiprocessing
import time

def a_start():
    for i in range(10):
        print(i)
        time.sleep(1)
        
def b_start():
    for i in range(10):
        print(i)
        time.sleep(1)
        
if __name__ == ‘__main__‘:
    a_p = multiprocessing.Process(target=a_start)
    b_p = multiprocessing.Process(target=b_start)
    for p in (a_p, b_p):
        p.start()
    for p in (a_p, b_p):
        p.join()

进程池与进程锁

进程在创建和关闭的过程中会消耗资源,

进程池中的进程创建后不会被关闭,避免了创建与关闭的消耗

进程池的相关方法

函数名 介绍 参数 返回值
Pool 进程池创建 Processcount 进程池对象
apply_async 任务加入进程池(异步) func,args
close 关闭进程池
join 等待进程池任务结束

进程锁的加锁与解锁

from multiprocessing import Manager()
manage = Manager()
lock = manage.Lock()
函数名 介绍
acquire 上锁
release 开锁(解锁)

进程中的通信

进程通过队列进行信息的传递,队列的创建方法如下表格

函数名 介绍 参数 返回值
Queue 队列的创建 mac_cout 队列对象
put 信息放入队列 message
get 获取队列信息 str

线程方法 terminate可以终止队列传输

# 进程通信实例:
# coding:utf-8

import time
import multiprocessing
import json


class Work():

    def __init__(self, q):
        self.q = q  # 接收队列,实例化队列

    def send(self, message):
        # 如果接收的message不是字符串,则进行格式化
        if not isinstance(message, str):
            result = json.dumps(message)
        self.q.put(result)

    def send_all_p(self):
        for i in range(20):
            self.q.put(‘当前发送的数字:%s‘%i)
            time.sleep(1)

    def get_mes(self):
        while True:
            ‘‘‘一直获取程序发送的信息‘‘‘
            res = self.q.get()
            try:
                result = json.loads(res)
            except:
                result = res
            print(result)


if __name__ == ‘__main__‘:
    p = multiprocessing.Queue()
    work = Work(p)
    send = multiprocessing.Process(target=work.send, args=({‘名字‘:‘程昱延‘},))
    gt = multiprocessing.Process(target=work.get_mes)
    send_all = multiprocessing.Process(target=work.send_all_p)

    send.start()
    send_all.start()
    gt.start()

    send_all.join()
    gt.terminate()  # 终止队列传输

线程模块--threading

线程的创建

方法名 说明 举例
Thread 创建线程 Thread(target, args)

线程对象的方法

方法名 说明 用法
start 启动线程 stat()
join 阻塞直到线程执行结束 join(timeout=None)
getName 获取线程的名字 getName()
setName 设置线程的名字 setName()
is_alive 判断线程是否存活 is_alive()
setDaemon 守护线程 setDaemon(True)

线程池--concurrent

方法名 说明 举例
futures.ThreadPoolExecutor 创建线程池 ThreadPoolExecutor(max_workers)

线程池对象的方法

方法名 说明 用法
submit 往线程池中加入任务 submit(target,args)
done 线程池中的某个线程是否完成了任务 done()
result 获取当前线程执行任务的结果 result()

异步与多线程多进程

  • 轻量级的线程 (协程)
  • 可以获取异步函数的返回值
  • 主进程需要异步才行
  • 更适合文件读写使用

async与await关键字

  • async定义异步
  • await执行异步

asyncio调用async函数

函数 介绍 参数 返回值
gather 将异步函数批量执行 asyncfunc... List 函数的返回结果
run 执行主异步函数 [task] 执行函数的返回结果
import asyncio
import random


async def a():
    for i in range(5):
        print(i, ‘a‘)
        await asyncio.sleep(random.random() * 2)
    return ‘a‘


async def b():
    for i in range(5):
        print(i, ‘b‘)
        await asyncio.sleep(random.random() * 2)
    return ‘b‘


async def main():
    result = await asyncio.gather(
        a(),
        b()
    )
    print(result)


if __name__ == ‘__main__‘:
    asyncio.run(main())

第三方模块gevent

安装方式

pip install gevent
# windows 可能需要安装:
Microsoft Visual C++
# linux 可能需要安装
pip install wheel

gevent模块常用方法

函数名 介绍 参数 返回值
spawn 创建协程对象 Func,args 协程对象
joinall 批量处理协程对象 [spawnobj] [spawnobj]

多线程多进程和异步

原文:https://www.cnblogs.com/C-yuyan/p/14401070.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!