码迷,mamicode.com
首页 > 编程语言 > 详细

python之路——多线程

时间:2017-06-14 21:18:29      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:active   面向对象   start   pre   bsp   one   循环   images   tar   

1、多线程模块 import threading

2、用函数写一个多线程例子

import threading,time
def talk(name):
    print(name,"is tlaking",threading.current_thread(),threading.active_count())
    time.sleep(2)
    print("thread done ....",name)

p1 = threading.Thread(target=talk,args = ("alex",))
p2 = threading.Thread(target=talk,args = ("japhi",))
p1.start()
p2.start()

  结果是:

alex is tlaking <Thread(Thread-1, started 5680)> 2
japhi is tlaking <Thread(Thread-2, started 4592)> 3
thread done .... alex
thread done .... japhi

其中threading.current_thread() 用来打印当前的线程,threading.active_count()打印线程数,结果是一起运行。

3、用面向对象的方式写一个多线程

import threading,time
class Mythread(threading.Thread):
    def __init__(self,name):
        super(Mythread,self).__init__()
        self.name = name
    def run(self):                                  #必须是run
        print(self.name,"is tlaking")
        time.sleep(2)

p3 = Mythread("alex")
p4 = Mythread("japhi")
p3.start()
p4.start()

  但是,面向对象的形式中的方法名必须是run

4、join()方法

  join方法是指当前线程执行完才能继续执行下一个线程,代码示例

import threading,time
start_time = time.time()
def talk(name):
    print(name,"is tlaking",threading.current_thread(),threading.active_count())
    time.sleep(2)
    print("thread done ....",name)
p1 = threading.Thread(target=talk,args = ("alex",))
p2 = threading.Thread(target=talk,args = ("japhi",))
p1.start()
p1.join()
p2.start()
print("cost:",time.time() - start_time)

结果是:

先打印:alex is tlaking <Thread(Thread-1, started 3444)> 2
2秒后。。。
打印:thread done .... alex
japhi is tlaking <Thread(Thread-2, started 11988)> 2
cost: 2.0001144409179688
2秒后打印:thread done .... japhi

  等1线程执行完后才执行线程2

4、以一个循环的例子:

import threading,time
start_time = time.time()
def talk(name):
    print(name,"is tlaking",threading.current_thread(),threading.active_count())
    time.sleep(2)
    print("thread done ....",name)
res = []
for i in range(10):
    p1 = threading.Thread(target=talk,args = (i,))    #多线程并发,target是任务,args是参数,参数后面一定要加,
    p1.setDaemon(True)  # 把当前线程变为守护线程
    p1.start()
    res.append(p1)
for obj in res:
    obj.join()

print("cost:",time.time() - start_time)

  计算10个线程都结束后花的时间,结果是cost: 2.0021145343780518

5、守护线程

  t.setDaemon(True)   将t这个线程设为守护线程,主线程代码结束后不会等t线程是否结束,直接退出程序

import threading,time
start_time = time.time()
def talk(name):
    print(name,"is tlaking",threading.current_thread(),threading.active_count())
    time.sleep(2)
    print("thread done ....",name)
for i in range(10):
    p1 = threading.Thread(target=talk,args = (i,))    #多线程并发,target是任务,args是参数,参数后面一定要加,
    p1.setDaemon(True)  # 把当前线程变为守护线程
    p1.start()
print("cost:",time.time() - start_time)

  结果是:

技术分享

python之路——多线程

标签:active   面向对象   start   pre   bsp   one   循环   images   tar   

原文地址:http://www.cnblogs.com/japhi/p/7010806.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!