侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

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

2022-07-05 星期二 / 0 评论 / 0 点赞 / 50 阅读 / 4047 字

一 概念介绍 Thread 是threading模块中最重要的类之一,可以使用它来创建线程。有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法;另一种是创建一个threadin

一 概念介绍

        Thread 是threading模块中最重要的类之一,可以使用它来创建线程。有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法;另一种是创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入.

        Thread模块是比较底层的模块,Threading模块是对Thread做了一些包装的,可以更加方便的被使用。

        另外在工作时,有时需要让多条命令并发的执行, 而不是顺序执行.

        有关线程的详细介绍,请参考官方文档 https://docs.python.org/2/library/threading.html

二 代码样例

#!/usr/bin/python# encoding=utf-8# Filename: thread-extends-class.py# 直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的 class里import threadingimport 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 threadingimport 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 datetimeimport osimport threadingdef 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()

广告 广告

评论区