python自动化学习笔记之DAY9
一、并发编程之多进程
1、multiprocessing模块
multiprocessing模块是用来开启子进程的,并在子进程中执行我们的任务。它支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。
该模块与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。
2、开启进程的方式
方式一:
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() #启动进程
p1.join() #主线程等待p1终止,才能运行
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('主')
注意:在Windows中Process()必须放到#if __name__ == '__main__':下
2、Process简单介绍
Process([group [,target[,name[,args[,kwargs]]]]])
1、group参数未使用,值为None
2、target表示调用对象,即子进程要执行的任务
3、args表示调用对象的位置参数元组,args=(1,2,'candy',) ,这是指定的给target函数的位置参数,元组形式。必须有逗号。
4、kwargs表示调用对象的字典,kwargs={'name':'candy','age':28}
5、name为子进程的名称
6、p.start():启动进程,并调用该子进程中的p.run()
7、p.jion():主进程等待子进程终止之后才能运行
3、守护进程
主进程创建守护进程,当主进程运行完毕之后,守护进程也会终止
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也执行了,但是随即被终止
4、进程同步锁
进程之间数据不共享,但是共享同一套文件系统,为了避免错乱,需要加锁处理
加锁:由并发变成了串行,牺牲运行效率,避免竞争
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('主')
二、paramiko模块
paramiko是用于做远程控制的模块,该模块可以对远程服务器进行命令或文件操作
1、SSHClient
使用用户名密码进行连接
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='xxx') # 执行命令 stdin, stdout, stderr = ssh.exec_command('df') # 获取命令结果 result = stdout.read() print(result.decode('utf-8')) # 关闭连接 ssh.close()
2、SFTPClient
使用用户名上传下载
import paramiko transport = paramiko.Transport(('120.92.84.249',22)) transport.connect(username='root',password='xxx') sftp = paramiko.SFTPClient.from_transport(transport) # 将location.py 上传至服务器 /tmp/test.py sftp.put('/tmp/id_rsa', '/etc/test.rsa') # 将remove_path 下载到本地 local_path sftp.get('remove_path', 'local_path') transport.close()
浙公网安备 33010602011771号