week9-python之进程相关属性
开启进程方式一:
from multiprocessing import Process import time def work(name): print('task <%s> is runing' %name) time.sleep(2) print('task <%s> is done' % name) if __name__ == '__main__': # Process(target=work,kwargs={'name':'egon'}) p1=Process(target=work,args=('egon',)) p2=Process(target=work,args=('alex',)) p1.start() p2.start() print('主')
开启进程方式二(自定义):
from multiprocessing import Process import time class MyProcess(Process): def __init__(self,name): super().__init__() self.name=name def run(self): print('task <%s> is runing' % self.name) time.sleep(2) print('task <%s> is done' % self.name) if __name__ == '__main__': p=MyProcess('egon') p.start() print('主')
join方法:
from multiprocessing import Process import time def work(name): print('task <%s> is runing' %name) time.sleep(3) print('task <%s> is done' % name) if __name__ == '__main__': p1=Process(target=work,args=('egon',)) p2=Process(target=work,args=('alex',)) p3=Process(target=work,args=('yuanhao',)) # p1.start() # p2.start() # p3.start() # # p1.join() #主进程等,等待p1运行结束 # p2.join() #主进程等,等待p2运行结束 # p3.join() #主进程等,等待p3运行结束 p_l = [p1, p2, p3] for p in p_l: p.start() for p in p_l: p.join() print('主') # p_l = [p1, p2, p3] # for p in p_l: # p.start() # p.join() # p1.start() # p1.join() # p2.start() # p2.join() # p3.start() # p3.join() # print('主')
Process对象的其他方法或属性:
from multiprocessing import Process import time,os def work(): print('parent:%s task <%s> is runing' %(os.getppid(),os.getpid())) time.sleep(1000) print('parent:%s task <%s> is done' %(os.getppid(),os.getpid())) if __name__ == '__main__': p1=Process(target=work) p1.start() # p1.terminate() # time.sleep(3) # print(p1.is_alive()) # print(p1.name) # print(p1.pid) print('主',os.getpid(),os.getppid()) time.sleep(10000)
守护进程:
from multiprocessing import Process import time def foo(): print(123) time.sleep(1) print("end123") def bar(): print(456) time.sleep(3) print("end456") if __name__ == '__main__': p1=Process(target=foo) p2=Process(target=bar) p1.daemon=True p1.start() p2.start() print("main-------") #打印该行则主进程代码结束,则守护进程p1应该被终止,可能会有p1任务执行的打印信息123,因为主进程打印main----时,p1也执行了,但是随即被终止
同步锁:
from multiprocessing import Process,Lock import time def work(name,mutex): mutex.acquire() print('task <%s> is runing' %name) time.sleep(2) print('task <%s> is done' % name) mutex.release() if __name__ == '__main__': mutex=Lock() p1=Process(target=work,args=('egon',mutex)) p2=Process(target=work,args=('alex',mutex)) p1.start() p2.start() print('主')
进程间共享数据:
from multiprocessing import Process,Manager,Lock def task(dic,mutex): with mutex: dic['count']-=1 if __name__ == '__main__': mutex=Lock() m=Manager() dic=m.dict({'count':100}) p_l=[] for i in range(100): p=Process(target=task,args=(dic,mutex)) p_l.append(p) p.start() for p in p_l: p.join() print(dic)
队列操作:
队列的作业:1.解耦,使程序直接实现松耦合 2.提高处理效率
FIF0=first in first out
LIFO=last in first out
from multiprocessing import Queue # q=Queue(3) # # q.put('first') # q.put('second') # q.put('third') # # q.put('fourth') # # print(q.get()) # print(q.get()) # print(q.get()) # print(q.get()) #了解 q=Queue(3) q.put('first',block=False) q.put('second',block=False) q.put('third',block=False) # q.put_nowait('fourth') #q.put('fourth',block=False) q.put('fourth',timeout=3)
生产者消费者模型:
作用:解耦,2个互相不影响
# from multiprocessing import Process,Queue # import time,os # def producer(q,name): # for i in range(3): # time.sleep(1) # res='%s%s' %(name,i) # q.put(res) # print('\033[45m<%s> 生产了 [%s]\033[0m' %(os.getpid(),res)) # # def consumer(q): # while True: # res=q.get() # if res is None:break # time.sleep(1.5) # print('\033[34m<%s> 吃了 [%s]\033[0m' % (os.getpid(), res)) # # if __name__ == '__main__': # q=Queue() # #生产者们:即厨师们 # p1=Process(target=producer,args=(q,'包子')) # p2=Process(target=producer,args=(q,'饺子')) # p3=Process(target=producer,args=(q,'馄饨')) # # #消费者们:即吃货们 # c1=Process(target=consumer,args=(q,)) # c2=Process(target=consumer,args=(q,)) # # p1.start() # p2.start() # p3.start() # c1.start() # c2.start() # # p1.join() # p2.join() # p3.join() # q.put(None) # q.put(None) # # print('主') from multiprocessing import Process, JoinableQueue import time, os def producer(q, name): for i in range(3): time.sleep(1) res = '%s%s' % (name, i) q.put(res) print('\033[45m<%s> 生产了 [%s]\033[0m' % (os.getpid(), res)) q.join() def consumer(q): while True: res = q.get() time.sleep(1.5) print('\033[34m<%s> 吃了 [%s]\033[0m' % (os.getpid(), res)) q.task_done() if __name__ == '__main__': q = JoinableQueue() # 生产者们:即厨师们 p1 = Process(target=producer, args=(q, '包子')) p2 = Process(target=producer, args=(q, '饺子')) p3 = Process(target=producer, args=(q, '馄饨')) # 消费者们:即吃货们 c1 = Process(target=consumer, args=(q,)) c2 = Process(target=consumer, args=(q,)) c1.daemon=True c2.daemon=True p1.start() p2.start() p3.start() c1.start() c2.start() p1.join() print('主')
进程池:
from multiprocessing import Pool import os,time def work(n): print('task <%s> is runing' %os.getpid()) time.sleep(2) return n**2 if __name__ == '__main__': # print(os.cpu_count()) p=Pool(4) # for i in range(10): # res=p.apply(work,args=(i,)) # print(res) res_l=[] for i in range(10): res=p.apply_async(work,args=(i,)) res_l.append(res) p.close() p.join() # # for res in res_l: # print(res.get())

进程池之回调h函数:
import requests #pip3 install requests import os,time from multiprocessing import Pool def get_page(url): print('<%s> get :%s' %(os.getpid(),url)) respone = requests.get(url) if respone.status_code == 200: return {'url':url,'text':respone.text} def parse_page(dic): print('<%s> parse :%s' %(os.getpid(),dic['url'])) time.sleep(0.5) res='url:%s size:%s\n' %(dic['url'],len(dic['text'])) #模拟解析网页内容 with open('db.txt','a') as f: f.write(res) if __name__ == '__main__': p=Pool(4) urls = [ 'http://www.baidu.com', 'http://www.sina.com', 'http://www.sohu.com', 'http://www.qq.com', 'http://www.ly.com', 'http://www.chouti.com', 'http://www.dnion.com', ] for url in urls: p.apply_async(get_page,args=(url,),callback=parse_page) p.close() p.join() print('主进程pid:',os.getpid())
模拟抢票:
cat db.txt {"count": 0} ############ import json import os import time from multiprocessing import Process,Lock def search(): dic=json.load(open('db.txt')) print('\033[32m[%s] 看到剩余票数<%s>\033[0m' %(os.getpid(),dic['count'])) def get_ticket(): dic = json.load(open('db.txt')) time.sleep(0.5) #模拟读数据库的网络延迟 if dic['count'] > 0: dic['count']-=1 time.sleep(0.5) # 模拟写数据库的网络延迟 json.dump(dic,open('db.txt','w')) print('\033[31m%s 购票成功\033[0m' %os.getpid()) def task(mutex): search() mutex.acquire() get_ticket() mutex.release() if __name__ == '__main__': mutex=Lock() for i in range(10): p=Process(target=task,args=(mutex,)) p.start()
paramiko模块:
import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='120.92.84.249', port=22, username='root', password='123QWEasd') # 执行命令 stdin, stdout, stderr = ssh.exec_command('df') # 获取命令结果 result = stdout.read() print(result.decode('utf-8')) # 关闭连接 ssh.close() import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa') # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='120.92.84.249', port=22, username='root', pkey=private_key) # 执行命令 stdin, stdout, stderr = ssh.exec_command('df') # 获取命令结果 result = stdout.read() print(result.decode('utf-8')) # 关闭连接 ssh.close() ##############秘钥登陆########## import paramiko transport = paramiko.Transport(('192.168.88.88', 22)) transport.connect(username='root', password='12jjhd') sftp = paramiko.SFTPClient.from_transport(transport) # 将location.py 上传至服务器 /tmp/test.py sftp.put('id_rsa', '/tmp/test.rsa') # 将remove_path 下载到本地 local_path # sftp.get('remove_path', 'local_path') transport.close()
并发的套接字通信
server端:
from multiprocessing import Process from socket import * s=socket(AF_INET,SOCK_STREAM) s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) s.bind(('127.0.0.1',8080)) s.listen(5) def talK(conn,addr): while True: try: data=conn.recv(1024) if not data:break conn.send(data.upper()) except Exception: break conn.close() if __name__ == '__main__': while True: conn,addr=s.accept() p=Process(target=talK,args=(conn,addr)) p.start() s.close()
clent端:
from socket import * c=socket(AF_INET,SOCK_STREAM) c.connect(('127.0.0.1',8080)) while True: msg=input('>>: ').strip() if not msg:continue c.send(msg.encode('utf-8')) data=c.recv(1024) print(data.decode('utf-8')) c.close()
并发的UDP套接字
server端:
import socketserver class MyUDPhandler(socketserver.BaseRequestHandler): def handle(self): print(self.request) self.request[1].sendto(self.request[0].upper(),self.client_address) if __name__ == '__main__': s=socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyUDPhandler) s.serve_forever()
client端:
from socket import * udp_client=socket(AF_INET,SOCK_DGRAM) while True: msg=input('>>: ').strip() udp_client.sendto(msg.encode('utf-8'),('127.0.0.1',8080)) data,server_addr=udp_client.recvfrom(1024) print(data.decode('utf-8'))
志不强者智不达
浙公网安备 33010602011771号