"""
创建进程的方式有哪些
1.鼠标双击桌面一个应用图标
2.代码创建
创建进程的本质:在内存中申请一块内存空间用于运行相应的程序代码
"""# 代码创建进程有两种方式# 1.函数创建进程from multiprocessing import Process
defmy_print(data):
print('输出:'+data)
print('输出进程结束')
if __name__ == '__main__': # windows电脑需要加main判断,因为windows是以导入模块的形式创建的
p = Process(target=my_print,args=('我是输出函数',)) # 创建一个进程对象,绑定函数,参数
p.start() # 启动这个进程print('主进程结束')
输出结果:
主进程结束
输出:我是输出函数
输出进程结束
# 2.类创建进程from multiprocessing import Process
classMyProcess(Process): # 定义自己的进程类def__init__(self,data): # 重写__init__方法传参
self.data = data
super().__init__()
defrun(self): # 需要另外开辟进程的方法print('输出:'+self.data)
print('输出进程结束')
if __name__ == '__main__':
p = MyProcess('我是输出函数')
p.start()
print('主进程结束')
输出结果:
主进程结束
输出:我是输出函数
输出进程结束
进程实现并发
# 思路:每来一个连接我就开辟一个进程专门处理和这个连接的交互# 代码示例# 服务端代码import socket
from multiprocessing import Process
defget_server():
server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)
return server
# 把通信代码封装成函数defreply(sock):
whileTrue:
data = sock.recv(1024)
print(data.decode('utf8'))
sock.send(data.upper())
# 每来一个连接创建一个进程处理defmain():
server = get_server()
whileTrue:
sock, addr = server.accept()
if __name__ == '__main__':
p = Process(target=reply, args=(sock,))
p.start()
if __name__ == '__main__':
main()
# 客户端代码import socket
client = socket.socket()
client.connect(('127.0.0.1',8080))
whileTrue:
client.send('hello world'.encode('utf8'))
data = client.recv(1024)
print(data.decode('utf8'))
'''定义多个客户端,代码大致相同''''''
ps:windows系统需要将获取socket连接对象的代码封装成函数,否则会直接报错'OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次'
'''
join方法
# 作用
让主进程等待子进程结束再执行
eg:
from multiprocessing import Process
defmy_print(data):
print('输出:'+data)
print('输出进程结束')
if __name__ == '__main__': # windows电脑需要加main判断,因为windows是以导入模块的形式创建的
p = Process(target=my_print,args=('我是输出函数',)) # 创建一个进程对象,绑定函数,参数
p.start() # 启动这个进程
p.join()
print('主进程结束')
输出结果:
输出:我是输出函数
输出进程结束
主进程结束
进程间数据默认隔离
from multiprocessing import Process
data = 999defupdate():
global data # 声明修改全局名称空间变量data
data = 888if __name__ == '__main__':
p = Process(target=update)
p.start()
print(data) # 输出主进程的data # 999
update()
print(data) # 888'''
上述代码,子进程调用了修改全局变量的函数,但是主进程中的变量data并没有被修改,我们在主进程中调用修改方法,再输出则修改了
不同的进程间存在着数据默认隔离,即当前进程默认不能修改其他进程的数据
可以通过一些手段打破这个限制:队列
'''
进程对象属性和方法
"""
进程号如何查看
windows: tasklist结果集中PID
mac: ps -ef
通过端口号查看进程号
windows netstat -ano|findstr 端口号
mac sudo lsof -i tcp:端口号
杀进程
windows taskkill -f -pid 进程号
mac sudo kill 进程号
"""# 代码实现1.查看进程号的方法
1.1.current_process函数
from multiprocessing import Process, current_process
current_process().pid
# 获取进程号的用处之一就是可以通过代码的方式管理进程
windows taskkill关键字
mac/linux kill关键字
1.2.os模块
os.getpid() # 获取当前进程的进程号
os.getppid() # 获取当前进程的父进程号2.杀死子进程
terminate()
3.判断子进程是否存活
is_alive()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?