Skip to content

Commit

Permalink
更新了部分文档
Browse files Browse the repository at this point in the history
  • Loading branch information
jackfrued committed Sep 9, 2021
1 parent 1ef5bf0 commit 6f4066d
Show file tree
Hide file tree
Showing 15 changed files with 482 additions and 89 deletions.
23 changes: 11 additions & 12 deletions Day01-15/code/Day13/multiprocess1.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,23 @@
# 每个进程都有自己独立的内存空间 所以进程之间共享数据只能通过IPC的方式


from multiprocessing import Process, Queue
from multiprocessing import Process, Queue, current_process
from time import sleep


def sub_task(string, q):
number = q.get()
while number:
print('%d: %s' % (number, string))
sleep(0.001)
number = q.get()
def sub_task(content, counts):
print(f'PID: {current_process().pid}')
counter = 0
while counter < counts:
counter += 1
print(f'{counter}: {content}')
sleep(0.01)


def main():
q = Queue(10)
for number in range(1, 11):
q.put(number)
Process(target=sub_task, args=('Ping', q)).start()
Process(target=sub_task, args=('Pong', q)).start()
number = random.randrange(5, 10)
Process(target=sub_task, args=('Ping', number)).start()
Process(target=sub_task, args=('Pong', number)).start()


if __name__ == '__main__':
Expand Down
27 changes: 3 additions & 24 deletions Day16-20/16-20.Python语言进阶.md
Original file line number Diff line number Diff line change
Expand Up @@ -1110,34 +1110,13 @@ Python中实现并发编程的三种方案:多线程、多进程和异步I/O
self.balance = new_balance


class AddMoneyThread(threading.Thread):
"""自定义线程类"""

def __init__(self, account, money):
self.account = account
self.money = money
# 自定义线程的初始化方法中必须调用父类的初始化方法
super().__init__()

def run(self):
# 线程启动之后要执行的操作
self.account.deposit(self.money)

def main():
"""主函数"""
account = Account()
# 创建线程池
pool = ThreadPoolExecutor(max_workers=10)
futures = []
for _ in range(100):
# 创建线程的第1种方式
# threading.Thread(
# target=account.deposit, args=(1, )
# ).start()
# 创建线程的第2种方式
# AddMoneyThread(account, 1).start()
# 创建线程的第3种方式
# 调用线程池中的线程来执行特定的任务
future = pool.submit(account.deposit, 1)
futures.append(future)
# 关闭线程池
Expand All @@ -1150,9 +1129,9 @@ Python中实现并发编程的三种方案:多线程、多进程和异步I/O
if __name__ == '__main__':
main()
```

修改上面的程序,启动5个线程向账户中存钱,5个线程从账户中取钱,取钱时如果余额不足就暂停线程进行等待。为了达到上述目标,需要对存钱和取钱的线程进行调度,在余额不足时取钱的线程暂停并释放锁,而存钱的线程将钱存入后要通知取钱的线程,使其从暂停状态被唤醒。可以使用`threading`模块的`Condition`来实现线程调度,该对象也是基于锁来创建的,代码如下所示:

```Python
"""
多个线程竞争一个资源 - 保护临界资源 - 锁(Lock/RLock)
Expand Down Expand Up @@ -1222,7 +1201,7 @@ Python中实现并发编程的三种方案:多线程、多进程和异步I/O
if __name__ == '__main__':
main()
```

- 多进程:多进程可以有效的解决GIL的问题,实现多进程主要的类是`Process`,其他辅助的类跟`threading`模块中的类似,进程间共享数据可以使用管道、套接字等,在`multiprocessing`模块中有一个`Queue`类,它基于管道和锁机制提供了多个进程共享的队列。下面是官方文档上关于多进程和进程池的一个示例。

```Python
Expand Down
2 changes: 2 additions & 0 deletions Day36-40/code/HRS_create_and_init.sql
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,5 @@ insert into tb_emp values
-- 查询主管的姓名和职位

-- 查询月薪排名4~6名的员工排名、姓名和月薪

-- 查询每个部门月薪排前2名的员工姓名、月薪和部门编号
2 changes: 1 addition & 1 deletion Day41-55/54.单元测试.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## 单元测试

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

4 changes: 2 additions & 2 deletions Day61-65/65.解析动态内容.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@

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

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

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

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

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

Expand Down
4 changes: 0 additions & 4 deletions Day61-65/code/image360/image360/middlewares.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,6 @@ class TaobaoDownloaderMiddleWare(object):

def __init__(self, timeout=None):
self.timeout = timeout
# options = webdriver.ChromeOptions()
# options.add_argument('--headless')
# self.browser = webdriver.Chrome(options=options)
options = webdriver.ChromeOptions()
options.add_argument('--headless')
self.browser = webdriver.Chrome(options)
Expand All @@ -128,7 +125,6 @@ def __del__(self):
def process_request(self, request, spider):
try:
self.browser.get(request.url)
# Chrome对象的page_source代表了页面的HTML代码(带动态内容)
return HtmlResponse(url=request.url, body=self.browser.page_source,
request=request, encoding='utf-8', status=200)
except TimeoutException:
Expand Down
1 change: 0 additions & 1 deletion Day61-65/code/image360/image360/spiders/taobao.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from io import StringIO
from urllib.parse import urlencode
import re
Expand Down
10 changes: 5 additions & 5 deletions Day66-70/67.NumPy的应用.md
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,7 @@ Numpy最为核心的数据类型是`ndarray`,使用`ndarray`可以处理一维

```Python
array18 = plt.imread('guido.jpg')
array18
array18
```

输出:
Expand Down Expand Up @@ -1107,15 +1107,15 @@ print(np.log2(array35))
```Python
array37 = np.array([[4, 5, 6], [7, 8, 9]])
array38 = np.array([[1, 2, 3], [3, 2, 1]])
print(array37 * array38)
print(array37 ** array38)
print(np.power(array37, array38))
```
输出:
```
[[ 4 10 18]
[21 16 9]]
[[ 4 25 216]
[343 64 9]]
[[ 4 25 216]
[343 64 9]]
```
Expand Down Expand Up @@ -1376,7 +1376,7 @@ NumPy的`linalg`模块中有一组标准的矩阵分解运算以及诸如求逆
| `inner` | 数组的内积 |
| `outer` | 数组的叉积 |
| `trace` | 计算对角线元素的和 |
| `norm` | 求模运算 |
| `norm` | 求模(范数)运算 |
| `det` | 计算行列式的值(在方阵上计算得到的标量) |
| `matrix_rank` | 计算矩阵的秩 |
| `eig` | 计算矩阵的特征值(eigenvalue)和特征向量(eigenvector) |
Expand Down
Loading

0 comments on commit 6f4066d

Please sign in to comment.