Python网络编程与并发编程_01

进程

方法模式创建进程

import os
from multiprocessing import Process
from time import sleep


def func_1(name):
    print(f"当前进程ID: {os.getpid()}") # os.getpid()获取当前进程的ID

    print(f"当前进程父进程ID: {os.getppid()}") # os.getppid()获取当前进程的父进程ID

    print(f"Process: {name}, start")
    sleep(5) # 模拟进程执行时间
    print(f"Process: {name}, end")


# windows上多进程实现的bug,如果不加main限制,就会无限制的创建子进程,从而报错
if __name__ == '__main__': 
   print("当前进程ID: ", os.getpid())
   
   # 创建进程
   process_1 = Process(target=func_1, args=("Process-1",))
   process_1.start()  # 启动进程

类模式创建进程

from multiprocessing import Process
from time import sleep


class myProcess(Process):
    def __init__(self, name):
        # super().__init__()  # 调用父类的构造函数
        Process.__init__(self)
        self.name = name

    def run(self):
        print(f"Process: {self.name}, start")
        sleep(5)
        print(f"Process: {self.name}, end")


if __name__ == '__main__': 
   # 创造进程
   process_1 = myProcess("Process_1")
   process_1.start()

使用Queue实现进程间通信

from multiprocessing import Process, Queue
from time import sleep


class myProcess(Process):
    def __init__(self, name, my_queue):
        super().__init__()
        self.name = name
        self.my_queue = my_queue
    
    def run(self):
        print(f"Process: {self.name}, start")

        print(f"get Data: {self.my_queue.get()}")  # 获得队列队头元素
        sleep(5)
        self.my_queue.put(f"new_data: {self.name}")  # 添加新数据

        print(f"Process: {self.name}, end")
        

if __name__ == '__main__': 
    my_queue = Queue()
    my_queue.put("0")
    my_queue.put("1")
    my_queue.put("2")

    # 进程列表
    process_list = []
    for i in range(3):
        p  = myProcess(f"process_{i}", my_queue)
        process_list.append(p)
    
    for p in process_list:
        p.start()
    
    for p in process_list:
        p.join()  # 等待所有子进程都结束
    
    print("主进程结束")
    print(my_queue.get())
    print(my_queue.get())
    print(my_queue.get())

在这里插入图片描述

import multiprocessing
from time import sleep


def func1(pipe_1):
    sub_info = "hello, world"
    print(f"进程1---{multiprocessing.current_process().pid}发送数据: {sub_info}")
    sleep(2)
    
    pipe_1.send(sub_info)
    print(f"来自进程2: {pipe_1.recv()}")
    sleep(2)

def func2(pipe_2):
    sub_info = "你好"
    print(f"进程2---{multiprocessing.current_process().pid}发送数据: {sub_info}")
    sleep(2)
    
    pipe_2.send(sub_info)
    print(f"来自进程1: {pipe_2.recv()}")
    sleep(2)


if __name__ == '__main__': 
   # 创建管道
   pipe_1, pipe_2 = multiprocessing.Pipe()
   
   # 创建子进程
   process_1 = multiprocessing.Process(target=func1, args=(pipe_1,))
   process_2 = multiprocessing.Process(target=func2, args=(pipe_2,))
   
   # 启动子进程
   process_1.start()
   process_2.start()

Manager管理器实现进程通信

from multiprocessing import Process, Manager


def func(name, m_list, m_dict):
    m_dict["name"] = "aaaaa"
    m_list.append("你好")


if __name__ == '__main__':
    with Manager() as manager:
        manager_list = manager.list()
        manager_dict = manager.dict()

        manager_list.append("Hello")

        # 两个进程不能直接互相使用对象,需要互相沟通
        process_1 = Process(target=func, args=("process_1", manager_list, manager_dict))
        process_1.start()
        process_1.join()  # 等 process_1进程结束,主进程继续执行

        print(f"主进程: {manager_list}")
        print(f"主进程: {manager_dict}")


进程池

用的时候套模板,就可以,不需要自己再敲一敲,对,重在收藏嘿嘿

在这里插入图片描述

在这里插入图片描述

进程池_with管理

在这里插入图片描述

协程

协程是什么

在这里插入图片描述

协程,也叫做纤程,全称是“协同程序”,用来实现任务协作。由程序员自己写程序来管理。

一个故事说明进程、线程、协程的关系

在这里插入图片描述

协程的核心

  • 控制流的让出和恢复

在这里插入图片描述

协程和多线程比较

在这里插入图片描述

协程的优点

在这里插入图片描述

协程的缺点

在这里插入图片描述

★asyncio实现协程

在这里插入图片描述

import asyncio
import time


async def func_1():  # async表示方法是异步的
    for i in range(3):
        print(f"北京: 第{i}次打印")
        await asyncio.sleep(1)
    return "func_1执行完毕"


async def func_2():
    for i in range(3):
        print(f"上海: 第{i}次打印")
        await asyncio.sleep(1)
    return "func_2执行完毕"


async def main():
    res = await asyncio.gather(func_1(), func_2())
    # await 异步执行func_1方法
    # 返回值为函数的返回值列表
    print(res)


if __name__ == '__main__':
    start = time.time()
    asyncio.run(main())
    end = time.time()
    print(f"耗时{end - start}")
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值