目录一览
创建进程的多种方式
"""
1.双击桌面程序图标
2.代码创建进程(需要掌握)
需要掌握两种即可
"""
from multiprocessing import Process
import time
"""
创建进程的代码在不同的操作系统中 底层原理有区别!!!
在windows中 创建进程类似于导入模块
if __name__ == '__main__': 启动脚本
在mac、linux中 创建进程类似于直接拷贝
不需要启动脚本 但是为了兼容性 也可以使用
"""
class MyProcess(Process):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print(f'{self.name}正在运行')
time.sleep(5)
print(f'{self.name}运行结束')
if __name__ == '__main__':
obj = MyProcess('jason')
obj.start()
print('主进程')
join方法
join:主进程等待子进程运行结束之后再运行
推导步骤1:直接在主进程代码中添加time.sleep()
不合理 因为无法准确把握子进程执行的时间
推导步骤2:join方法
很合理!!!
def task(name, n):
print(f'{name}正在运行')
time.sleep(n)
print(f'{name}运行结束')
if __name__ == '__main__':
p1 = Process(target=task, args=('jason', 1))
p2 = Process(target=task, args=('kevin', 2))
p3 = Process(target=task, args=('jerry', 3))
start_time = time.time()
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
p3.join()
end_time = time.time() - start_time
print('总耗时:%s' % end_time)
print('主进程')
'''一定要看准join的执行位置 以及多任务情况下等待的目标'''
进程间数据默认隔离
多个进程数据彼此之间默认是相互隔离的
如果真的想交互 需要借助于'管道'或者'队列'
from multiprocessing import Process
money = 100
def task():
global money
money = 666
print('子进程打印的money', money)
if __name__ == '__main__':
p = Process(target=task)
p.start()
p.join()
print('父进程打印的money', money)
进程间通信(IPC机制)
预备知识
什么是队列:先进先出
from multiprocessing import Queue
q = Queue(3)
print(q.get_nowait())
print(q.get_nowait())
print(q.get_nowait())
"""
q.full()
q.empty()
q.get_nowait()
上述方法在多进程下不能准确使用(失效)!!!
"""
IPC机制
1.主进程与子进程通信
2.子进程与子进程通信
from multiprocessing import Queue, Process
def procedure(q):
q.put('子进程procedure往队里中添加了数据')
def consumer(q):
print('子进程的consumer从队列中获取数据', q.get())
if __name__ == '__main__':
q = Queue()
p1 = Process(target=procedure, args=(q,))
p2 = Process(target=consumer, args=(q,))
p1.start()
p2.start()
print('主进程')
生产者消费者模型
生产者
产生数据
消费者
处理数据
"""
爬取红牛分公司
生产者:获取网页数据的代码(函数)
爬
消费者:从网页数据中筛选出符合条件的数据(函数)
筛选
完整的生产者消费者模型至少有三个部分
生产者
消息队列/数据库
消费者
"""
进程相关方法
1.查看进程号
from multiprocessing import current_process
import os
current_process().pid
os.getpid()
os.getppid()
2.销毁子进程
p1.terminate()
3.判断进程是否存活
p1.is_alive()
守护进程
如何理解守护
伴随着守护对象的存活而存活 死亡而死亡
from multiprocessing import Process
import time
def task(name):
print('大内总管:%s存活' % name)
time.sleep(3)
print('大内总管:%s嗝屁' % name)
if __name__ == '__main__':
p = Process(target=task, args=('基佬',))
p.start()
p.daemon = True
print('天子Jason寿终正寝!!!')
僵尸进程与孤儿进程
僵尸进程
进程已经运行结束 但是相关的资源并没有完全清空
需要父进程参与回收
孤儿进程
父进程意外死亡 子进程正常运行 该子进程就称之为孤儿进程
孤儿进程也不是没有人管 操作系统会自动分配福利院接收
互斥锁
模拟抢票
查票
买票
查票
买票
from multiprocessing import Process
import time
import json
import random
def search(name):
with open(r'data.json', 'r', encoding='utf8') as f:
data = json.load(f)
print('%s在查票 当前余票为:%s' % (name, data.get('ticket_num')))
def buy(name):
with open(r'data.json', 'r', encoding='utf8') as f:
data = json.load(f)
time.sleep(random.randint(1, 3))
if data.get('ticket_num') > 0:
data['ticket_num'] -= 1
with open(r'data.json', 'w', encoding='utf8') as f:
json.dump(data, f)
print('%s买票成功' % name)
else:
print('%s很倒霉 没有抢到票' % name)
def run(name):
search(name)
buy(name)
if __name__ == '__main__':
for i in range(10):
p = Process(target=run, args=('用户%s'%i, ))
p.start()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)