文档章节

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

cloud-coder
 cloud-coder
发布于 2014/04/24 15:06
字数 732
阅读 18924
收藏 59

一 概念介绍

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

© 著作权归作者所有

cloud-coder
粉丝 249
博文 194
码字总数 141537
作品 0
广州
架构师
私信 提问
加载中

评论(5)

cloud-coder
cloud-coder 博主
你的文档是采用utf-8编码的嘛

如果不是,请修改
#!/usr/bin/python
# encoding=utf-8

中的encoding
cloud-coder
cloud-coder 博主
我用的环境是RHEL6.5 自带的python 2.6.6
cloud-coder
cloud-coder 博主
程序开始运行2014-04-25 09:01:31.335430
命令ifconfig开始运行2014-04-25 09:01:31.335648
命令ping www.baidu.com开始运行2014-04-25 09:01:31.336568
eth0 Link encap:Ethernet HWaddr 00:0C:29:6F:C3:D9
inet addr:192.168.230.128 Bcast:192.168.230.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe6f:c3d9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:333 errors:0 dropped:0 overruns:0 frame:0
TX packets:319 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:41165 (40.2 KiB) TX bytes:30902 (30.1 KiB)
......
命令ifconfig结束运行2014-04-25 09:01:31.338019
PING www.a.shifen.com (115.239.210.27) 56(84) bytes of data.
64 bytes from 115.239.210.27: icmp_seq=1 ttl=128 time=26.7 ms
筱龙缘
筱龙缘
0[Decode error - output not utf-8]
0
命令ping www.baidu.com结束运行2014-04-24 22:54:43.886000
0
命令ping www.baidu.com结束运行2014-04-24 22:54:43.893000
0
命令ping www.baidu.com结束运行2014-04-24 22:54:43.894000
0
命令ping www.baidu.com结束运行2014-04-24 22:54:43.899000
0
命令ping www.baidu.com结束运行2014-04-24 22:54:43.902000
程序结束运行2014-04-24 22:54:43.902000
[Finished in 3.5s]
筱龙缘
筱龙缘
程序开始运行2014-04-24 22:54:40.551000
命令ping www.baidu.com开始运行2014-04-24 22:54:40.551000
命令ping www.baidu.com开始运行2014-04-24 22:54:40.552000
命令ping www.baidu.com开始运行2014-04-24 22:54:40.552000
命令ping www.baidu.com开始运行2014-04-24 22:54:40.552000
命令ping www.baidu.com开始运行2014-04-24 22:54:40.553000
命令ping www.baidu.com开始运行2014-04-24 22:54:40.554000
命令ping www.baidu.com开始运行2014-04-24 22:54:40.554000
命令ping www.baidu.com开始运行2014-04-24 22:54:40.554000
命令ipconfig开始运行2014-04-24 22:54:40.555000
[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Decode error - output not utf-8]
[Decode
Python RPC 远程调用脚本之 RPyC 实践

最近有个监控需求,需要远程执行集群每个节点上的脚本,并获取脚本执行结果,为了安全起见不需要账号密码登陆节点主机,要求只需要调用远程脚本模块的方法就能实现。 总结下python进行远程调...

大数据之路
2015/06/28
0
0
python多线程和多进程——python并行编程实验

工作中经常涉及到加速程序的运行,除了代码逻辑的优化,算法的优化之外,还经常使用的一招就是并发编程。至于python的并发编程这一块,笔者看到一些python圈的圈友们经常诟病python的全局解释...

王鹏你妹
05/29
0
0
python 高性能编程之协程

用 greenlet 协程处理异步事件 自从 PyCon 2011 协程成为热点话题以来,我一直对此有着浓厚的兴趣。为了异步,我们曾使用多线程编程。然而线程在有着 GIL 的 Python 中带来的性能瓶颈和多线程...

passionfly
2015/05/07
0
0
(转载)Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程 - 笑虎的文章 - 知乎

Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程 - 笑虎的文章 - 知乎 https://zhuanlan.zhihu.com/p/24283040 Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线...

avatus
2018/09/05
0
0
尹立博:Python 全局解释器锁与并发 | AI 研习社第 59 期猿桌会

雷锋网 AI 科技评论按:作为排名靠前的最受欢迎和增长最快的编程语言之一,Python 是一种多用途、高级别、面向对象、交互式、解释型和对用户非常友好的编程语言,拥有卓越的可读性和极高的自...

丛末
2018/12/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

优雅的关闭Spring Boot

优雅的关闭Spring Boot 1、实现 TomcatConnectorCustomizer 接口拿到Tomcat的连接获取 Tomcat连接池 2、实现 ApplicationListener<ContextClosedEvent> 监听服务器关闭事件,注册JVM钩子函数...

sowhat
今天
2
0
Python3-Web开发

简介 Web开发框架 什么是Web框架? Web应用程序框架或简单的Web框架表示一组库和模块,使Web应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等低级细节。 virtualenv是一个虚拟...

wuxinshui
今天
3
0
使用技媒体实践编写发布博客

技媒体实践博客 CSDN OSChina 知乎 简书 思否 掘金 51CTO

晨猫
今天
2
0
Lucene

1、什么是全文检索 数据分类 我们生活中的数据总体分为两种:结构化数据和非结构化数据。 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。 非结构化数据:指不定长或无固...

榴莲黑芝麻糊
昨天
5
0
python到setuptools、pip工具的安装

python安装 基础开发库   apt-get install gcc  apt-get install openssl libssl-dev 安装数据库和开发库   apt-get install mysql-server libmysqld-dev python环境   下载地址...

问题终结者
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部