python中多线程(threading、队列、event、paramiko)

时间:2020-12-01 00:20:30

首先说一下pyhton中的多线程,因为是直接调用底层的C库,没有自己的底层方法 ,所以不如其它语言,应该算是python中的一个缺陷吧。

在多线程中,要引入模块threading,使用时,通过T1=threading.Thread(target=func,args=('arg1',''arg2)来建立一个线程的实例对象。使用T1.start()来启动线程。

看一看具体的代码:

 1 #可以看到大致的流程,但其中的线程锁,好像不起作用。主要是看一下守护线程的用法和JOIN的用法 。 
 2 
 3 import threading,time
 4 lock=threading.Lock()
 5 num=1
 6 def run():
 7     lock.acquire()#线程锁,对3.0以上版本无效。
 8     global num
 9     num=num*2
10     lock.release()
11 t_obj=[]
12 start_time=time.time()
13 for i in range(50):
14     t=threading.Thread(target=run)
15     #t.setDaemon(True) #设置这个线程为主线程的守护线程。
16     t.start()
17     t_obj.append(t)
18 for i in t_obj:
19     i.join()
20 print('num:',num)
21 #print ('done time is ',time.time()-start_time)

在线程知识中,有一个EVEVT比较实用。

#可以看到,这里的Event类似于一个全局变量,两个值:True  False
import
threading,time event=threading.Event() def light(): count=0 event.set() while True: if count>3 and count <=5: event.clear() print('Red light') elif count>5: event.set() print('Green light') count=0 else: print ('runing....') count+=1 def car(name): while True: if event.is_set(): print('car %s is run.....'%name) else: print('car %s is wait.....'%name) event.wait() l1=threading.Thread(target=light,) l1.start() c1=threading.Thread(target=car,args='Weiz') c1.start() # event.wait()(等待标志被设置) event.set() (对标志进行设置 ) event.clear() I(清除标志的设置) event.is_set() (判断是否设置标志) 四个方法。

另外,利用线程和队列结合,有利于“高内聚、低耦合”的实现,提高效率。

''' 生产者消费者模式的PYTHON演示实现。主要知识点:队列 以生产饺子、吃饺子为例'''

import threading,queue,time# 线程 队列 日期
q=queue.Queue(maxsize=10)  #first in first out
#q1=queue.LifoQueue(maxsize=10)  last in first out
# q2=queue.PriorityQueue(maxsize=10) 可以设置优先级
def product():
    n=1
    while True:
        q.put('饺子%s'%n)
        print('生产了饺子',n)
        time.sleep(0.2)
        n+=1

def consumer(name):
    while True:
        print("%s eating %s"%(name,q.get()))
        time.sleep(0.1)
p=threading.Thread(target=product,)
p.start()
c=threading.Thread(target=consumer,args=('Jack',))
c.start()
c1=threading.Thread(target=consumer,args=('Tom',))
c1.start()

除了以上知识外,还有一个paramiko 模块,可以实现SSH的客户端,利用多线程,可以实现对多台主机的批量管理,可以批量执行命令,批量发送文件。

代码示例:执行指令。

 1 import paramiko
 2 # 创建SSH对象
 3 ssh = paramiko.SSHClient()
 4 # 允许连接不在know_hosts文件中的主机
 5 
 6 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 7 # 连接服务器
 8 ssh.connect(hostname='10.0.0.31', port=52113, username='root', password='123456')
 9 # 执行命令
10 stdin, stdout, stderr = ssh.exec_command('df')
11 # 获取命令结果
12 res,err = stdout.read(),stderr.read()
13 result = res if res else err
14 
15 print(result.decode())
16 
17 # 关闭连接
18 ssh.close()

代码示例:发送文件。

import paramiko
transport = paramiko.Transport(('10.0.0.31', 52113))
transport.connect(username='root', password='123456')
sftp = paramiko.SFTPClient.from_transport(transport)
# 将file1 上传至服务器 /tmp/sftp.put(file1, '/tmp')
# 将file2 下载到本地 local_path
sftp.get(file2_path, 'fromlinux.txt')

transport.close()