python多线程的join起什么作用

最近在学python的多线程,写了一个这样的代码,发现多线程和单线程的执行速度是一样的啊。我现在觉得问题是join这里,下面是代码,请各位高手帮我看看这是神马情况?

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import urllib2
import urllib
import threading
import time

start_time = 0
end_time = 0

def fetch():
    req = urllib2.Request('http://www.baidu.com')
    response = urllib2.urlopen(req)
    #获取提交后返回的信息
    content = response.read()
    # print content
    end_time = time.time()
    print '\nFinished in ' + str(end_time - start_time) + 's'

def single():
    for x in xrange(20):
        fetch()

def multi():
    for x in xrange(20):
        t = threading.Thread(target=fetch)
        t.start()
        t.join()

if __name__ == '__main__':
    start_time = time.time()
    multi() # 多线程
    # single() # 单线程
    end_time = time.time()
    print '\nFinished in ' + str(end_time - start_time) + 's'

就这段代码,在if name == '__main__':中切换multi()和single()的注释执行,发现时间几乎没有差别,请问是怎么回事呢?比如说我现在要多线程获取百度首页,究竟应该是怎么写代码呢?

图片描述这是执行结果,下面是多线程,上面是单线程

阅读 4.3k
3 个回答

t.join() 会阻塞主线程,直至分线程结束,其实就是变回单线程了

#t.join() 把这句注释就行了~


那请问如果我希望所有子线程都等执行最慢的那个子线程结束之后在到主线程上,怎么弄啊?

@昌维001

def multi():
    thds = [threading.Thread(target=fetch) for x in xrange(20)]
    for t in thds: t.start()
    for t in thds: t.join()

你把join去掉就行啦,让线程直接把结果存到数据库里面,或者使用多进程,协程等技术。

multi的join位置写错了。应该在for外面去join;
这个join如第一个评论所说的,主线程等待子线程完成;你放到for里面,start一个子线程,
然后就去join,这个就阻塞了。没法进行start下一个多线程。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题