python多进程(加入进程池)操作常见案例
本文实例讲述了python多进程(加入进程池)操作。分享给大家供大家参考,具体如下:
一、多进程复制多个文件
importmultiprocessing
importos
importtime
#复制文件,传入文件名
defcopy_file(old_file_name,old_name):
new_file_name='new_file'
new_name=old_name
ifnotos.path.exists(new_file_name):
os.makedirs(new_file_name)
withopen(old_file_name+'/'+old_name,'rb')asf:
file_content=f.read()
withopen(new_file_name+'/'+new_name,'wb')asf:
f.write(file_content)
if__name__=='__main__':
old_file_name='old_file'
name_list=os.listdir(old_file_name)
time_old=time.time()
fornameinname_list:
process=multiprocessing.Process(target=copy_file,args=(old_file_name,name))
process.start()
time_new=time.time()
print('执行时间:%f'%(time_new-time_old))
二、优化加入进程池,并显示复制进度:
importmultiprocessing
importos
importtime
#复制文件,传入文件名
defcopy_file(old_file_name,old_name,queue):
new_file_name='new_file'
new_name=old_name
ifnotos.path.exists(new_file_name):
os.makedirs(new_file_name)
withopen(old_file_name+'/'+old_name,'rb')asf:
file_content=f.read()
withopen(new_file_name+'/'+new_name,'wb')asf:
f.write(file_content)
queue.put(new_file_name)
if__name__=='__main__':
old_file_name='old_file'#存放文件的文件名
name_list=os.listdir(old_file_name)#取出所有文件的文件名
queue=multiprocessing.Manager().Queue()#创建队列对象,用于计算复制完成百分比
po=multiprocessing.Pool(3)#创建线程池
time_old=time.time()#用于计算花费时间
fornameinname_list:
po.apply_async(copy_file,(old_file_name,name,queue))
po.close()
index=0
whileTrue:
index+=1
queue.get()
print('\r以保存%.2f%%'%((index/len(name_list))*100),end='')
ifindex==len(name_list):
break
time_new=time.time()
print('执行时间:%f'%(time_new-time_old))
三、多进程聊天器:
importmultiprocessing
importsocket
importthreading
#需求:
#1.主进程创建一个TCPconnect
#2.主进程connect后创建进程开启一个新的Socketconnect
#3.进程里创建线程不断的接收和提示发送消息
#有连接时新创建一个进程处理聊天
defspeak_send(tcp_msg):
whileTrue:
test=input('请输入要发送的消息')
tcp_msg.send(test.encode('utf-8'))
defspeak_rec(tcp_msg):
whileTrue:
print(tcp_msg.recv(1024).decode('gbk'))
#开启的进程聊天
defspeak_process(tcp_sock,tcp_msg,ip):
print('开启进程')
#5.开线程循环接收消息
msg_rec=threading.Thread(target=speak_rec,args=(tcp_msg,))
#print(tcp_msg.recv(1024).decode('gbk'))
#6.开线程循环发送消息
msg_send=threading.Thread(target=speak_send,args=(tcp_msg,))
msg_rec.start()
msg_send.start()
msg_rec.join()
msg_send.join()
#7.关闭
#tcp_msg.close()
defmain():
#1创建TCP对象
tcp_sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.绑定ip和端口
tcp_sock.bind(('',9999))
#3.改主动为被动
tcp_sock.listen(128)
#4.accept接收msg和ip
whileTrue:
tcp_msg,ip=tcp_sock.accept()
process=multiprocessing.Process(target=speak_process,args=(tcp_sock,tcp_msg,ip))
process.start()
if__name__=='__main__':
main()
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。