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()

 

posted @ 2017-08-31 23:37  糖果的海角sky  阅读(110)  评论(0)    收藏  举报