python实现多线程的方式及多条命令并发执行

903次阅读  |  发布于5年以前

一、概念介绍

Thread 是threading模块中最重要的类之一,可以使用它来创建线程。有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法;另一种是创建一个threading.Thread对象,在它的初始化函数(init)中将可调用对象作为参数传入.
Thread模块是比较底层的模块,Threading模块是对Thread做了一些包装的,可以更加方便的被使用。
另外在工作时,有时需要让多条命令并发的执行, 而不是顺序执行。

二、代码样例


    #!/usr/bin/python
    # encoding=utf-8
    # Filename: thread-extends-class.py
    # 直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的 class里
    import threading
    import time

    class ThreadImpl(threading.Thread):
     def __init__(self, num):
      threading.Thread.__init__(self)
      self._num = num

     def run(self):
      global total, mutex

      # 打印线程名
      print threading.currentThread().getName()

      for x in xrange(0, int(self._num)):
       # 取得锁
       mutex.acquire()
       total = total + 1
       # 释放锁
       mutex.release()

    if __name__ == '__main__':
     #定义全局变量
     global total, mutex
     total = 0
     # 创建锁
     mutex = threading.Lock()

     #定义线程池
     threads = []
     # 创建线程对象
     for x in xrange(0, 40):
      threads.append(ThreadImpl(100))
     # 启动线程
     for t in threads:
      t.start()
     # 等待子线程结束
     for t in threads:
      t.join() 

     # 打印执行结果
     print total

    #!/usr/bin/python
    # encoding=utf-8
    # Filename: thread-function.py
    # 创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行

    import threading
    import time

    def threadFunc(num):
     global total, mutex

     # 打印线程名
     print threading.currentThread().getName()

     for x in xrange(0, int(num)):
      # 取得锁
      mutex.acquire()
      total = total + 1
      # 释放锁
      mutex.release()

    def main(num):
     #定义全局变量
     global total, mutex
     total = 0
     # 创建锁
     mutex = threading.Lock()

     #定义线程池
     threads = []
     # 先创建线程对象
     for x in xrange(0, num):
      threads.append(threading.Thread(target=threadFunc, args=(100,)))
     # 启动所有线程
     for t in threads:
      t.start()
     # 主线程中等待所有子线程退出
     for t in threads:
      t.join() 

     # 打印执行结果
     print total


    if __name__ == '__main__':
     # 创建40个线程
     main(40)

    #!/usr/bin/python
    # encoding=utf-8
    # Filename: put_files_hdfs.py
    # 让多条命令并发执行,如让多条scp,ftp,hdfs上传命令并发执行,提高程序运行效率
    import datetime
    import os
    import threading

    def execCmd(cmd):
     try:
      print "命令%s开始运行%s" % (cmd,datetime.datetime.now())
      os.system(cmd)
      print "命令%s结束运行%s" % (cmd,datetime.datetime.now())
     except Exception, e:
      print '%s\t 运行失败,失败原因\r\n%s' % (cmd,e)

    if __name__ == '__main__':
     # 需要执行的命令列表
     cmds = ['ls /root',
        'pwd',]

     #线程池
     threads = []

     print "程序开始运行%s" % datetime.datetime.now()

     for cmd in cmds:
      th = threading.Thread(target=execCmd, args=(cmd,))
      th.start()
      threads.append(th)

     # 等待线程运行完毕
     for th in threads:
      th.join()

     print "程序结束运行%s" % datetime.datetime.now()

以上就是本文的全部内容,希望对大家学习python程序设计有所帮助。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8