白话Python 进程,线程,协程

批评一个语言,多半是对这个语言不了解的人,夸奖一个语言,多半也是对这个语言不了解的人。
--Q.yuhen

Python被人诟病最多的大概就是性能差,在这里讲一下 Python 的多进程,多线程与协程。首先声明这不是教程,看完这篇文章,大概能够对 Python 的多进程与多线程有一定的了解。

进程

进程是正则执行的程序实例。执行程序的过程中,内核会讲程序代码载入虚拟内存,喂程序变量分配空间,建立 bookkeeping 数据结构,来记录与进程有关的信息,比如进程 ID,用户 ID 等

创建进程的时候,内核会为进程分配一定的资源,并在进程存活的时候不断进行调整,比如内存,进程创建的时候会占有一部分内存。进程结束的时候资源会释放出来,来让其他资源使用。

我们可以把进程理解为一种容器,容器内的资源可多可少,但是在容器内的程序只能使用容器内的东西。

线程

UNIX 中,一个进程中可以执行多个线程。多个线程共享进程内的资源。所以可以将线程可以看成是共享同一虚拟内存以及其他属性的进程。

线程相对于进程的优势在于同一进程下的不同线程之间的数据共享更加容易。

Python被诟病最多的大概就是解释器全局锁(GIL)了,GIL 的存在是为了实现 Python 中对于共享资源访问的互斥。而且是非常霸道的解释器级别的互斥。在 GIL 的机制下,一个线程访问解释器之后,其他的线程就需要等待这个线程释放之后才可以访问。这种处理方法在单处理器下面并没有什么问题,单处理器的本质是无法并行的。但是再多处理器下面,这种方法会导致无法利用多核的优势。

Python 的线程调度跟操作系统的进程调度类似,都属于抢占式的调度。一个进程执行了一定时间之后,发出一个信号,操作系统响应这个时钟中断(信号),开始进程调度。而在 Python 中,则通过软件模拟这种中断,来实现线程调度。

协程

协程我们可以看成是一种用户空间的线程,协程是主动的协作是工作,现有的操作系统线程调度是抢占式。两种的区别在于协作是调度,需要之前的任务主动放弃时间片。

总结

在 Python 中,使用协程来做并发是对于系统资源消耗最小,可以最大化的做高并发,但是,需要我们自己来做调度,操作系统不会主动调度任务。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习中最常用的数学工具是线性代数、微积分和概率论。下面是一些基本的数学概念和 Python 代码示例: 1. 向量和矩阵 向量是一列数字,矩阵是一个二维数组。在 Python 中,可以使用 NumPy 库来创建和操作向量和矩阵。 ```python import numpy as np # 创建向量 v = np.array([1, 2, 3]) # 创建矩阵 m = np.array([[1, 2], [3, 4], [5, 6]]) # 矩阵乘法 result = np.dot(m, v) print(result) ``` 2. 梯度下降 梯度下降是一种优化算法,用于最小化损失函数。在 Python 中,可以使用 NumPy 和 SciPy 库来实现梯度下降算法。 ```python import numpy as np from scipy.optimize import minimize # 定义损失函数 def loss_function(w, X, y): y_hat = np.dot(X, w) return np.mean((y_hat - y) ** 2) # 定义梯度函数 def gradient(w, X, y): y_hat = np.dot(X, w) return np.dot(X.T, y_hat - y) / len(y) # 使用梯度下降算法求解 X = np.array([[1, 2], [3, 4], [5, 6]]) y = np.array([1, 2, 3]) w0 = np.zeros(X.shape[1]) res = minimize(loss_function, w0, args=(X, y), jac=gradient) print(res.x) ``` 3. 偏导数和梯度 偏导数是多元函数中某个变量的导数,梯度是多元函数的导数向量。在 Python 中,可以使用 SymPy 库来计算偏导数和梯度。 ```python from sympy import symbols, diff # 定义符号变量和函数 x, y = symbols('x y') f = x ** 2 + y ** 3 # 计算偏导数 df_dx = diff(f, x) df_dy = diff(f, y) print(df_dx, df_dy) # 计算梯度 grad = [diff(f, var) for var in [x, y]] print(grad) ``` 4. 概率分布和随机变量 概率分布是随机变量可能取值的概率分布。在 Python 中,可以使用 SciPy 库来计算概率分布和随机变量。 ```python from scipy.stats import norm # 定义正态分布 mu, sigma = 0, 1 dist = norm(mu, sigma) # 计算概率密度函数和累积分布函数 x = np.linspace(-3, 3, 1000) pdf = dist.pdf(x) cdf = dist.cdf(x) # 生成随机变量 samples = dist.rvs(1000) ``` 以上是一些基本的数学概念和 Python 代码示例。在机器学习中,还会涉及到更高级的数学工具,如矩阵分解、优化理论、贝叶斯统计等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值