Crossin的编程教室

标题: Python第72课,多线程 [打印本页]

作者: qingdien    时间: 2021-5-15 13:48
标题: Python第72课,多线程
我的代码和课程中代码完全一样,为何得不到课程中的结果?代码和得到的结果如下:

#-*-coding: 'utf-8' -*-

import requests, threading   #引入requests的模块和threading的模块

def get_weather(city):
    req=requests.get('http://wthrcdn.etouch.cn/weather_mini?city=%s' % city)  #用get方法打开该网址,并将结果保存在变量req中
    #print(req)
    dic_city=req.json() #把json格式的数据转换为字典
    #print(dic_city)

    city_data=dic_city.get('data')  #用字典的get方法,没有data的话返回[]
    #print(city_data.get('city'))
    if city_data:
        city_forecast=city_data['forecast'][0]
        print(
            city_data.get('city'),
            city_forecast.get('date'),
            city_forecast.get('high'),
            city_forecast.get('low'),
            city_forecast.get('type')
        )
    else:
        print('未获得')
    #print()

threads=[]
cities=['北京', '上海', '南京 ', '深圳', '广州', '杭州', '苏州','天津', '西安', '成都']
files=range(len(cities))
#第一个循环,针对每一个城市,都创建一个新线程,并将线程加入到一个列表中,用于之后的启动
for i in files:  #创建线程
    t=threading.Thread(target=get_weather, args=(cities,))
    threads.append(t)
#第二个循环,start正式开启子线程
for i in files:
    threads.start()
#第三个循环,join用来同步数据,主线程运行到这一步,将会停下来等待子线程运行完毕
#若没有这句,主线程会忽略子线程,运行完自己的代码后结束程序
for i in files:
    threads.join()
print('结束获取')

我得到的结果中,城市和对应的天气不对应在一起,见图片所示。
看起来乱乱的,而课程中的结果城市和对应的天气是在一行的。 屏幕截图 2021-05-15 134557.jpg
这是为什么呢?








作者: crossin先生    时间: 2021-5-15 15:27
多线程是不保证输出顺序的,因为大家共用一个输出通道,哪个线程输出了就显示哪个的,几个线程的内容会混到一起。

课程里作为基本的线程使用讲解,并没有细化展开这个问题。

如果你需要保持顺序的输出,可以选择线程获取到结果之后都先存入一个列表。然后等所有线程结束之后再一次性输出列表里的内容

即,在 get_weather 不要 print 结果,而是将处理好的字符串 append 到一个 全局global 的列表里。在最后结束的地方在遍历列表输出





欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5