由于进程间不共享数据,通信间使用Socket和Queue通信。通信不只是发送接收消息,还能实现数据的上传与下载。
socket与queue之间的不同:socket不只是能单机之间通信,还可以实现网络之间的多台电脑之间的通信。queue队列通信先近先出。
本文就文件上的数据传递作为进程间的数据共享作为案例。
importmultiprocessing
defread(file_name,queue):
try:
file =open(file_name,"rb")
content = file.read()
queue.put(content)
exceptException:
pass
defwrite(file_name,queue):
print(queue.empty())
if notqueue.empty():
withopen("[复件]"+file_name,"wb")asfile:
file.write(queue.get(True))
print("写入成功。")
else:
print("请求文件不存在")
defmain():
queue = multiprocessing.Queue()
file_name =input("请输入文件名称:")
p1 = multiprocessing.Process(target=read,
args=(file_name,queue))
p2 = multiprocessing.Process(target=write,
args=(file_name,queue))
p1.start()
p1.join()
p2.start()
if__name__ =='__main__':
main()
importsocket
importmultiprocessing
defwrite(file_name):
"""文件的读取并发送"""
client_tcp_socket = socket.socket(
socket.AF_INET,socket.SOCK_STREAM)
client_tcp_socket.connect(("",
8080))#创建客户端的socket
try:
content =open(file_name,"rb")
txt = content.read()
client_tcp_socket.send(txt)
content.close()
exceptException:
print("你请求的文件不存在。")
finally:
client_tcp_socket.close()
defmain():
"""本文最初想法是,新建两个子进程,
一个子进程负责获取要拷贝的文件内容,
发送给另一个子进程,另一个子进程负责接收,
并新建文件保存接收到了拷贝的内容。
主进程先建立一个服务器tcp套接字,
使其处于监听状态,再新建一个客户端服务器,
链接到服务器,将两个socket分别作为参数传
递给两个进程,进行操作。最后关闭套接
字,错在不能将套接字作为参数传递给子进程"""
file_name =input("请输入要拷贝的文件:")
server_tcp_socket = socket.socket(
socket.AF_INET,socket.SOCK_STREAM)
server_tcp_socket.bind(("",8080))
server_tcp_socket.listen(128)
#创建服务器的socket,进入监听状态
p1 = multiprocessing.Process(target=write,
args=(file_name,))
p1.start()
p1.join()
new_tcp_socket,client_add =
server_tcp_socket.accept()
data = new_tcp_socket.recv(1024)
ifdata:
withopen("[复件]"+file_name,"wb")
asfile:
#数据写入
file.write(data)
print("拷贝成功。")
else:
print("拷贝失败。")
new_tcp_socket.close()
server_tcp_socket.close()
if__name__ =='__main__':
main()
有什么错误,希望大神能给指出,交流下,大家共同进步。
领取专属 10元无门槛券
私享最新 技术干货