• python模块之threading: 在python中使用多线程


    转载自:http://hi.baidu.com/156544632/blog/item/48b54595fd9fb40e7af480fb.html

    python是支持多线程的,并且是native的线程。主要是通过thread和threading这两个模块来实现的。thread是比较底层的模块,threading是对thread做了一些包装的,可以更加方便的被使用。这里需要提一下的是python对线程的支持还不够完善,不能利用多 CPU,但是下个版本的python中已经考虑改进这点,让我们拭目以待吧。
        threading模块里面主要是对一些线程的操作对象化了,创建了叫Thread的class。一般来说,使用线程有两种模式,一种是创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行;另一种是直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的 class里。我们来看看这两种做法吧。

    #-*- encoding: gb2312 -*-
    import string, threading, time

    def
    thread_main(a):
    global
    count, mutex
    # 获得线程名

    threadname = threading.currentThread().getName()

    for x in
    xrange(0, int(a)):
    # 取得锁

    mutex.acquire()
    count
    = count + 1

    # 释放锁
    mutex.release()
    print
    threadname, x, count
    time.sleep(
    1
    )

    def
    main(num):
    global
    count, mutex
    threads
    =
    []

    count
    = 1

    # 创建一个锁
    mutex = threading.Lock()
    # 先创建线程对象

    for x in xrange(0, num):
    threads.append(threading.Thread(target
    =thread_main, args=(10
    ,)))
    # 启动所有线程

    for t in threads:
    t.start()
    # 主线程中等待所有子线程退出

    for t in threads:
    t.join()


    if __name__ == '__main__'
    :
    num
    = 4

    # 创建4个线程
    main(4)
    
    
    上面的就是第一种做法,这种做法是很常见的,下面是另一种,曾经使用过Java的朋友应该很熟悉这种模式:
    #-*- encoding: gb2312 -*-
    import threading
    import
    time

    class
    Test(threading.Thread):
    def __init__
    (self, num):
    threading.Thread.
    __init__
    (self)
    self._run_num
    =
    num

    def
    run(self):
    global
    count, mutex
    threadname
    =
    threading.currentThread().getName()

    for x in
    xrange(0, int(self._run_num)):
    mutex.acquire()
    count
    = count + 1

    mutex.release()
    print threadname, x, count
    time.sleep(
    1
    )

    if __name__ == '__main__'
    :
    global
    count, mutex
    threads
    =
    []
    num
    = 4

    count
    = 1
    # 创建锁
    mutex = threading.Lock()
    # 创建线程对象

    for x in xrange(0, num):
    threads.append(Test(
    10
    ))
    # 启动线程

    for t in threads:
    t.start()
    # 等待子线程结束

    for t in threads:
    t.join()
    
    
  • 相关阅读:
    POJ 1795 DNA Laboratory
    CodeForces 303B Rectangle Puzzle II
    HDU 2197 本源串
    HDU 5965 扫雷
    POJ 3099 Go Go Gorelians
    CodeForces 762D Maximum path
    CodeForces 731C Socks
    HDU 1231 最大连续子序列
    HDU 5650 so easy
    大话接口隐私与安全 转载
  • 原文地址:https://www.cnblogs.com/sislcb/p/1340589.html
Copyright © 2020-2023  润新知