进程
方法模式创建进程
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}")