全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 python论坛
2093 1
2016-02-19

在python开发(http://www.maiziedu.com/course/python-px/中,我们一般通过threadthreading这两个模块来实现多线程的,因为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',

     

    #线程池

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


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-2-23 09:31:14
补充一点,非抬扛。针对很对人使用自己的windows电脑来跑python,用multiprocessing也是较好的一种解决方案,据网上评测在多核cpu上效果比threading可能要好(非自己测试,我是直接用了,没有用threading)。multiprocessing的库也是python标配,使用起来也非常方便。

同时提醒一下,我基于windows7/10 64bits + Anaconda的环境中multiprocessing出错,即可以跑,但是输出(print)不到标准输出环境如屏幕/IPython console,而是跑到奇怪的地方去了。个人找到的解决方案是用Pycharm(非常好的商业IDE,有免费版,可以和Anaconda一起用),完美解决。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群