Skip to content

Commit 6f4066d

Browse files
committed
更新了部分文档
1 parent 1ef5bf0 commit 6f4066d

15 files changed

+482
-89
lines changed

Day01-15/code/Day13/multiprocess1.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,23 @@
1010
# 每个进程都有自己独立的内存空间 所以进程之间共享数据只能通过IPC的方式
1111

1212

13-
from multiprocessing import Process, Queue
13+
from multiprocessing import Process, Queue, current_process
1414
from time import sleep
1515

1616

17-
def sub_task(string, q):
18-
number = q.get()
19-
while number:
20-
print('%d: %s' % (number, string))
21-
sleep(0.001)
22-
number = q.get()
17+
def sub_task(content, counts):
18+
print(f'PID: {current_process().pid}')
19+
counter = 0
20+
while counter < counts:
21+
counter += 1
22+
print(f'{counter}: {content}')
23+
sleep(0.01)
2324

2425

2526
def main():
26-
q = Queue(10)
27-
for number in range(1, 11):
28-
q.put(number)
29-
Process(target=sub_task, args=('Ping', q)).start()
30-
Process(target=sub_task, args=('Pong', q)).start()
27+
number = random.randrange(5, 10)
28+
Process(target=sub_task, args=('Ping', number)).start()
29+
Process(target=sub_task, args=('Pong', number)).start()
3130

3231

3332
if __name__ == '__main__':

Day16-20/16-20.Python语言进阶.md

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1110,34 +1110,13 @@ Python中实现并发编程的三种方案:多线程、多进程和异步I/O
11101110
self.balance = new_balance
11111111

11121112

1113-
class AddMoneyThread(threading.Thread):
1114-
"""自定义线程类"""
1115-
1116-
def __init__(self, account, money):
1117-
self.account = account
1118-
self.money = money
1119-
# 自定义线程的初始化方法中必须调用父类的初始化方法
1120-
super().__init__()
1121-
1122-
def run(self):
1123-
# 线程启动之后要执行的操作
1124-
self.account.deposit(self.money)
1125-
11261113
def main():
11271114
"""主函数"""
11281115
account = Account()
11291116
# 创建线程池
11301117
pool = ThreadPoolExecutor(max_workers=10)
11311118
futures = []
11321119
for _ in range(100):
1133-
# 创建线程的第1种方式
1134-
# threading.Thread(
1135-
# target=account.deposit, args=(1, )
1136-
# ).start()
1137-
# 创建线程的第2种方式
1138-
# AddMoneyThread(account, 1).start()
1139-
# 创建线程的第3种方式
1140-
# 调用线程池中的线程来执行特定的任务
11411120
future = pool.submit(account.deposit, 1)
11421121
futures.append(future)
11431122
# 关闭线程池
@@ -1150,9 +1129,9 @@ Python中实现并发编程的三种方案:多线程、多进程和异步I/O
11501129
if __name__ == '__main__':
11511130
main()
11521131
```
1153-
1132+
11541133
修改上面的程序,启动5个线程向账户中存钱,5个线程从账户中取钱,取钱时如果余额不足就暂停线程进行等待。为了达到上述目标,需要对存钱和取钱的线程进行调度,在余额不足时取钱的线程暂停并释放锁,而存钱的线程将钱存入后要通知取钱的线程,使其从暂停状态被唤醒。可以使用`threading`模块的`Condition`来实现线程调度,该对象也是基于锁来创建的,代码如下所示:
1155-
1134+
11561135
```Python
11571136
"""
11581137
多个线程竞争一个资源 - 保护临界资源 - 锁(Lock/RLock)
@@ -1222,7 +1201,7 @@ Python中实现并发编程的三种方案:多线程、多进程和异步I/O
12221201
if __name__ == '__main__':
12231202
main()
12241203
```
1225-
1204+
12261205
- 多进程:多进程可以有效的解决GIL的问题,实现多进程主要的类是`Process`,其他辅助的类跟`threading`模块中的类似,进程间共享数据可以使用管道、套接字等,在`multiprocessing`模块中有一个`Queue`类,它基于管道和锁机制提供了多个进程共享的队列。下面是官方文档上关于多进程和进程池的一个示例。
12271206

12281207
```Python

Day36-40/code/HRS_create_and_init.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,5 @@ insert into tb_emp values
6969
-- 查询主管的姓名和职位
7070

7171
-- 查询月薪排名4~6名的员工排名、姓名和月薪
72+
73+
-- 查询每个部门月薪排前2名的员工姓名、月薪和部门编号

Day41-55/54.单元测试.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
## 单元测试
22

3-
Python标准库中提供了名为`unittest` 的模块来支持我们对代码进行单元测试。所谓单元测试是指针对程序中最小的功能单元(在Python中指函数或类中的方法)进行的测试
3+
请各位读者移步到[《使用Django开发商业项目》](../Day91-100/95.使用Django开发商业项目.md)一文
44

Day61-65/65.解析动态内容.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66

77
下面我们以“360图片”网站为例,说明什么是JavaScript逆向工程。其实所谓的JavaScript逆向工程就是找到通过Ajax技术动态获取数据的接口。在浏览器中输入<http://image.so.com/z?ch=beauty>就可以打开“360图片”的“美女”版块,如下图所示。
88

9-
![](./res/image360-website.png)
9+
![](https://gitee.com/jackfrued/mypic/raw/master/20210824004714.png)
1010

1111
但是当我们在浏览器中通过右键菜单“显示网页源代码”的时候,居然惊奇的发现页面的HTML代码中连一个`<img>`标签都没有,那么我们看到的图片是怎么显示出来的呢?原来所有的图片都是通过JavaScript动态加载的,而在浏览器的“开发人员工具”的“网络”中可以找到获取这些图片数据的网络API接口,如下图所示。
1212

13-
![](./res/api-image360.png)
13+
![](https://gitee.com/jackfrued/mypic/raw/master/20210824004727.png)
1414

1515
那么结论就很简单了,只要我们找到了这些网络API接口,那么就能通过这些接口获取到数据,当然实际开发的时候可能还要对这些接口的参数以及接口返回的数据进行分析,了解每个参数的意义以及返回的JSON数据的格式,这样才能在我们的爬虫中使用这些数据。
1616

Day61-65/code/image360/image360/middlewares.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,6 @@ class TaobaoDownloaderMiddleWare(object):
111111

112112
def __init__(self, timeout=None):
113113
self.timeout = timeout
114-
# options = webdriver.ChromeOptions()
115-
# options.add_argument('--headless')
116-
# self.browser = webdriver.Chrome(options=options)
117114
options = webdriver.ChromeOptions()
118115
options.add_argument('--headless')
119116
self.browser = webdriver.Chrome(options)
@@ -128,7 +125,6 @@ def __del__(self):
128125
def process_request(self, request, spider):
129126
try:
130127
self.browser.get(request.url)
131-
# Chrome对象的page_source代表了页面的HTML代码(带动态内容)
132128
return HtmlResponse(url=request.url, body=self.browser.page_source,
133129
request=request, encoding='utf-8', status=200)
134130
except TimeoutException:

Day61-65/code/image360/image360/spiders/taobao.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# -*- coding: utf-8 -*-
21
from io import StringIO
32
from urllib.parse import urlencode
43
import re

Day66-70/67.NumPy的应用.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ Numpy最为核心的数据类型是`ndarray`,使用`ndarray`可以处理一维
348348

349349
```Python
350350
array18 = plt.imread('guido.jpg')
351-
array18
351+
array18
352352
```
353353

354354
输出:
@@ -1107,15 +1107,15 @@ print(np.log2(array35))
11071107
```Python
11081108
array37 = np.array([[4, 5, 6], [7, 8, 9]])
11091109
array38 = np.array([[1, 2, 3], [3, 2, 1]])
1110-
print(array37 * array38)
1110+
print(array37 ** array38)
11111111
print(np.power(array37, array38))
11121112
```
11131113
11141114
输出:
11151115
11161116
```
1117-
[[ 4 10 18]
1118-
[21 16 9]]
1117+
[[ 4 25 216]
1118+
[343 64 9]]
11191119
[[ 4 25 216]
11201120
[343 64 9]]
11211121
```
@@ -1376,7 +1376,7 @@ NumPy的`linalg`模块中有一组标准的矩阵分解运算以及诸如求逆
13761376
| `inner` | 数组的内积 |
13771377
| `outer` | 数组的叉积 |
13781378
| `trace` | 计算对角线元素的和 |
1379-
| `norm` | 求模运算 |
1379+
| `norm` | 求模(范数)运算 |
13801380
| `det` | 计算行列式的值(在方阵上计算得到的标量) |
13811381
| `matrix_rank` | 计算矩阵的秩 |
13821382
| `eig` | 计算矩阵的特征值(eigenvalue)和特征向量(eigenvector) |

0 commit comments

Comments
 (0)