零基础学 Python(2018 版)
尹会生
前游戏公司技术总监,前新浪网技术经理
80146 人已学习
新⼈⾸单¥68
课程目录
已完结/共 72 讲
第一章 :Python介绍和安装 (3讲)
第二章 :Python基础语法 (3讲)
第四章 :条件与循环 (5讲)
第五章 :映射与字典 (2讲)
第六章 :文件和输入输出 (2讲)
第七章 :错误和异常 (1讲)
第九章 :模块 (1讲)
第十章 :语法规范 (1讲)
第十一章 :面向对象编程 (4讲)
第十二章 :多线程编程 (2讲)
第十六章 :综合案例 & 结课测试 (1讲)
特别放送 (1讲)
零基础学 Python(2018 版)
登录|注册
留言
42
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 39 | 多线程编程的定义
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | Python语言的特点
02 | Python的发展历史与版本
03 | Python的安装
04 | Python程序的书写规则
05 | 基础数据类型
06 | 变量的定义和常用操作
07 | 序列的概念
08 | 字符串的定义和使用
09 | 字符串的常用操作
10 | 元组的定义和常用操作
11 | 列表的定义和常用操作
12 | 条件语句
13 | for循环
14 | while循环
15 | for循环语句中的if嵌套
16 | while循环语句中的if嵌套
17 | 字典的定义和常用操作
18 | 列表推导式与字典推导式
19 | 文件的内建函数
20 | 文件的常用操作
21 | 异常的检测和处理
22 | 函数的定义和常用操作
23 | 函数的可变长参数
24 | 函数的变量作用域
25 | 函数的迭代器与生成器
26 | Lambda表达式
27 | Python内建函数
28 | 闭包的定义
29 | 闭包的使用
30 | 装饰器的定义
31 | 装饰器的使用
32 | 自定义上下文管理器
33 | 模块的定义
34 | PEP8编码规范
35 | 类与实例
36 | 如何增加类的属性和方法
37 | 类的继承
38 | 类的使用-自定义with语句
39 | 多线程编程的定义
40 | 经典的生产者和消费者问题
41 | Python标准库的定义
42 | 正则表达式库re
43 | 正则表达式的元字符
44 | 正则表达式分组功能实例
45 | 正则表达式库函数match与search的区别
46 | 正则表达式库替换函数sub()的实例
47 | 日期与时间函数库
48 | 数学相关库
49 | 使用命令行对文件和文件夹操作
50 | 文件与目录操作库
51 | 机器学习的一般流程与NumPy安装
52 | NumPy的数组与数据类型
53 | NumPy数组和标量的计算
54 | NumPy数组的索引和切片
55 | pandas安装与Series结构
56 | Series的基本操作
57 | Dataframe的基本操作
58 | 层次化索引
59 | Matplotlib的安装与绘图
60 | 机器学习分类的原理
61 | Tensorflow的安装
62 | 根据特征值分类的模型和代码
63 | 网页数据的采集与urllib库
64 | 网页常见的两种请求方式get和post
65 | HTTP头部信息的模拟
66 | requests库的基本使用
67 | 结合正则表达式爬取图片链接
68 | Beautiful Soup的安装和使用
69 | 使用爬虫爬取新闻网站
70 | 使用爬虫爬取图片链接并下载图片
强势回归:零基础学Python2022版来啦!
71 | 如何分析源代码并设计合理的代码结构&结课测试
本节摘要

课程源码、课件及课后作业地址:

https://gitee.com/geektime-geekbang/geekbangpython

登录 后留言

全部留言(42)

  • 最新
  • 精选
从前慢
老师,我想不明白你重写这个run方法之后为什么这个线程还能够执行,之前是start函数调用原来这个run方法,你现在将它重写啦,重写不是覆盖前面父类的方法吗,您重写的run方法只是打印而已,怎么会执行呢?

作者回复: Thread是threading模块的一个用于创建线程的类,创建线程有两个方法,一个是通过继承Thread类,重写run方法;我在视频中演示的Mythread类就是这种方法了,要注意覆盖的是父类继承过来的run方法,start还是继承过来不变的。这里要注意的是start()和run() 是Thread的两种不同方法,官方定义在这里:https://docs.python.org/3.7/library/threading.html 那么把他们的解释翻译成中文就是 start() 开始线程工作,把run()方法放到一个另外的单独的线程里执行 ;run() 线程工作方法,在“当成”线程执行函数里面的代码。 所以他们的作用一个是开启新线程,一个是按照线程的方式执行程序。我们可以写个小程序来验证一下 import threading from threading import current_thread class Mythread(threading.Thread): def run(self): print(current_thread().getName()) t1 = Mythread() t1.run() t1.start() 这段程序的执行结果是: MainThread Thread-1 也就是说单独运行run()方法,会把主进程当做一个线程来看,执行的代码空间在MainThread主线程中,执行了start()方法,python会新创建一个线程,叫Thread-1,然后再去调用run()来运行,这就是他们两个的区别了。

2018-07-20
20
Julie
老师,这里用join方法是等线程执行完成后再回到主线程继续执行后续的代码。但当有多个线程时,如果每个线程都调用join方法,这样线程2就会等线程1执行完毕,再继续执行。会不会就失去了并发的意义? 代码如下: import time import threading from threading import currentThread class MyThread(threading.Thread): def run(self): print(currentThread().getName(), 'start') time.sleep(5) print(currentThread().getName(), 'stop') for i in range(1, 6, 1): thread = MyThread() thread.start() thread.join() print ('Main Thread stop') 输出结果: Thread-1 start Thread-1 stop Thread-2 start Thread-2 stop Thread-3 start Thread-3 stop Thread-4 start Thread-4 stop Thread-5 start Thread-5 stop Main Thread stop

作者回复: 做这样一个实验,thread.join()这条语句放在for循环中,放在for循环外(即这条语句前面没有空格),注释这条语句,观察一下输出有什么变化?你能解释三种变化的原因吗?

2018-11-14
2
5
Kanner
老师,我想问一下、那爬虫的多线程怎么实现啊,比如我的爬虫是:主页—所有城市—城市下所有游记 写了五个方法,每个方法都要通过上层传的参数进行解析下层内容 这时候多线程怎么实现呀

作者回复: 实现的方法还是很多的,我介绍一种主流的方法给你,其实你也意识到从主页到下一级页面的不可拆解,其实是不需要将他们都进行多线程化的,多线程的目的是充分发挥爬虫主机的性能,和充分利用上传下载带宽不对等的空闲时间。 可以考虑将获取需要下载游记的url作为一个方法,将这个方法多线程化,并发的获取url之后,将url存入一个临时的空间,再使用一个方法根据得到的url多线程化去请求网页并下载,既保证了采集url和下载的并发,又实现了异步,是不是设计的非常好?当然咱们同学也不用自己再开发这样的工具,有一个非常知名的爬虫框架叫做Scrapy就实现了这个功能,如果对多线程爬虫感兴趣建议学习一下这个框架和阅读它的例子

2018-06-26
5
硕杨Sxuya
多线程不能无限多吧,应该是看计算机的硬件性能。那么如何确定可以使用的最多线程?

作者回复: 最多线程由两方面决定:内存容量和软件限制。 虽然线程是轻量级进程,但是创建线程也是要消耗内存的,初始状态下消耗打小就是内存栈了,每创建一个线程为其分配一个线程栈; 还有一种限制是系统的配置参数限制,比如在linux上 每进程默认创建线程是1024个,在local_lim.h中定义。可以使用ulimt -a查看线程栈大小

2018-10-16
3
超仔
老师的这个栗子举得不好,可以看这个栗子: import threading from threading import currentThread import time import random def myThread(a, b): tName = currentThread().getName() print(tName + " is start") time.sleep(random.random()) # 让不同的线程执行先后不同 print("%s : %s %s" % (tName, a, b)) print(tName + " is end") print(currentThread().getName() + " is start") tArr = [] for i in range(1, 10): t = threading.Thread(target=myThread, args=(i, i + 1)) t.start() tArr.append(t) # 需要所有的线程都完成后台退出 for t in tArr: t.join() print(currentThread().getName() + " is end")

作者回复: 赞!

2021-02-17
2
汪V
老师,为什么MainTHread在5 6之前 程序 import threading import time from threading import current_thread def myThread(arg1, arg2): print(current_thread().getName(),'start') print('%s %s'%(arg1, arg2)) time.sleep(1) print(current_thread().getName(),'stop') for i in range(1,6,1): #t1 = myThread(i, i+1) t1 = threading.Thread(target=myThread,args=(i, i+1)) t1.start() print(current_thread().getName(),'end') 结果 Thread-1 start 1 2 Thread-2 start 2 3 Thread-3 start 3 4 Thread-4 start 4 5 Thread-5 start MainThread end 5 6 Thread-5 stop Thread-4 stop Thread-3 stop Thread-1 stop Thread-2 stop

作者回复: 1 “可能”在 5 6 之前结束, 因为多线程是并发执行,没有限制它何时结束自己 2 “可能”在5 6 之后结束,但是显示在了前面,因为产生结果是并行的,但是终端显示一定是串行的

2019-07-11
2
我是,露莹
老师您好,按照您课上教学的代码,请问为什么您的输出好像都是很整齐的。 而我的输出却如下很乱呢? Thread-1 start 1 2 Thread-2 start 2 3Thread-3 start Thread-43 4 start Thread-54 5 MainThread startend 5 6 Thread-1 stop Thread-4Thread-3Thread-5Thread-2 stopstopstop stop

作者回复: 您好,由于是多线程程序,输出内容不按顺序显示是正常现象

2019-04-24
2
1
一连
老师,您在最后提到控制线程结束的方法是t1.join(),并且先继承threading.Thread、重写了run()。但是我试着使用您前面不重写run(),直接将threading.Thread具体化到t1的方法,也可以通过t1.join()实现先结束t1所在的线程,最后再结束主线程。请问为什么要重写run呢?

作者回复: 默认的run 是没有任何功能的, 你只有重写了run才能通过多线程实现你的功能啊, threading 模块是实现了多线程的框架,需要多线程做什么事情,要在run里面实现

2019-04-05
1
老师,有问题请教下: (1)视频中join的例子,试验发现有没有t1.join输出都一样,这是为什么? (2)join的例子中增加sleep后,还是主线程先结束,这是为什么? [root@localhost python]# cat a.py import threading from threading import current_thread import time class Mythread(threading.Thread): def run(self): print(current_thread().getName(),'start function') print('run') time.sleep(2) print(current_thread().getName(),'stop function') t1=Mythread() t1.start() t1.join print(current_thread().getName(),'stop all script') [root@localhost python]# python3 a.py Thread-1 start function run MainThread stop all script Thread-1 stop function

作者回复: 1 join的例子因为刚接触到join()所以没有写比较复杂的例子,只是介绍了语法和功能,所以在用该示例代码时显得“join没啥用”,那么我提供一个父进程用作daemon进程的例子,将上面的程序稍作更改,这次启动多个线程你可以将join所在的for循环注释,就能对比出差别了,代码如下: import threading import time def run(): time.sleep(5) print('sub thread', threading.current_thread().name) time.sleep(2) if __name__ == '__main__': print('main thread start', threading.current_thread().name) thread_list = [] for i in range(5): t = threading.Thread(target=run) thread_list.append(t) for t in thread_list: t.setDaemon(True) t.start() for t in thread_list: t.join() print('main thread stop' , threading.current_thread().name)

2022-02-13
反侧
使用多线程写入内容到text文件中的时候,会出现顺序错乱的问题,单线程速度又太慢,请问老师有什么方法解决吗

作者回复: 写单个文件,是不能使用多线程的,一个是顺序错乱,另一个是一个文件进行多线程写不会加快写入速度。正确的做法是 1 使用raid技术加快磁盘读写速度,或者使用固态硬盘替代传统磁盘。 2 使用数据库,实现数据的并发写入

2021-11-23
收起评论