设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 16334|回复: 1
打印 上一主题 下一主题

Python第72课,多线程

[复制链接]

1

主题

0

好友

7

积分

新手上路

Rank: 1

跳转到指定楼层
楼主
发表于 2021-5-15 13:48:45 |只看该作者 |正序浏览
我的代码和课程中代码完全一样,为何得不到课程中的结果?代码和得到的结果如下:

#-*-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
这是为什么呢?







回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2021-5-15 15:27:59 |只看该作者
多线程是不保证输出顺序的,因为大家共用一个输出通道,哪个线程输出了就显示哪个的,几个线程的内容会混到一起。

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

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

即,在 get_weather 不要 print 结果,而是将处理好的字符串 append 到一个 全局global 的列表里。在最后结束的地方在遍历列表输出
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-21 21:54 , Processed in 0.017879 second(s), 30 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部