前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python多线程的正确使用

Python多线程的正确使用

作者头像
上帝De助手
发布2019-09-17 11:42:52
7120
发布2019-09-17 11:42:52
举报
文章被收录于专栏:TestQA

多线程是编程过程中经常会使用到的手段,其目的是为了能提高任务执行的效率。在Python中,我们都知道实现多线程主要有2种方式:

  • 使用threading.Thread()方法
  • 继承threading.Thread类

一个简单的多线程的样例如下:

代码语言:javascript
复制
import threading


l = []
n = 2
max_n = 10000
x = 0
def countdown():
    global x
    while x < max_n:
        x += 1
        print '%s: %s\r\n' % (threading.currentThread().getName(), x)


for i in range(n):
    t = threading.Thread(target=countdown) 
    t.start()
    l.append(t)


for t in l:
    t.join()

执行结果:

代码语言:javascript
复制
Thread-1: 1
Thread-1: 2
Thread-2: 3
Thread-1: 4
Thread-1: 5
Thread-2: 6

执行这段程序会启动n个线程同时对共享变量x进行交替加1操作,直到满足条件的最大数。是不是很简单?但是对于初学者来讲,一不小心就会让多线程变为单线程执行了。比如我们把代码稍微改动一下:

代码语言:javascript
复制
import threading


n = 2
max_n = 10000
x = 0
def countdown():
    global x
    while x < max_n:
        x += 1
        print '%s: %s\r\n' % (threading.currentThread().getName(), x)


for i in range(n):
    t = threading.Thread(target=countdown) 
    t.start()
    t.join()

执行结果:

代码语言:javascript
复制
Thread-1: 1
Thread-1: 2
Thread-1: 3
...
Thread-1: 10000

再次执行这段程序时,你会发现只启动1个线程对x变量进行加1操作。原因就是join语句的位置不一样,因为join会阻塞主线程的执行,所以我们不能在启动一个子线程后就执行join,这样会阻塞主线程启动其它子线程(上面代码中线程2是在线程1执行完任务之后才被启动的,而此时已经没有任务可做了),而应该在启动完所有子线程之后才执行join。

另外一些时候你可能有这样的需求。即希望主线程不要提前结束,直到所有的子线程都执行完毕;又希望在子线程运行的同时,主线程不要被阻塞暂停,而是仍然继续执行,直到主线程执行到最后才等待子线程的结束。那么此时你就可以去掉join方法即可:

代码语言:javascript
复制
import threading


n = 2
max_n = 10000
x = 0


def countdown():
    global x
    while x < max_n:
        x += 1
        print '%s: %s\r\n' % (threading.currentThread().getName(), x)


for i in range(n):
    t = threading.Thread(target=countdown)
    t.start()

最后如果你希望主线程在执行完之后,不要等待子线程而直接退出,那么可以使用setDaemon方法。设置这个方法,主线程在退出的时候不会检查子线程是否已结束。

代码语言:javascript
复制
import threading


n = 2
max_n = 10000
x = 0


def countdown():
    global x
    while x < max_n:
        x += 1
        print '%s: %s\r\n' % (threading.currentThread().getName(), x)


for i in range(n):
    t = threading.Thread(target=countdown)
    t.setDaemon(True)    ##一定要在start之前调用,否则无效
    t.start()

执行结果:

代码语言:javascript
复制
Thread-1: 1
Thread-1: 2
Thread-1: 3
...
Thread-1: 21 
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TestQA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档