Python进程和线程

上周 让我告诉你有关Python进程和线程的知识。

什么是进程? 操作系统分配资源的基本单位。
每个进程都有自己独立的内存空间。
系统资源也是独立的。
全局变量也有自己的变量。

如何创建流程? 使用 multiprocessing.Process 类。
比如这个例子: 蟒蛇 from multiprocessing import Process
def task(): print("子进程执行")
if __name__ == '__main__': p = 进程(目标=任务) p.start() p.join()
什么场景适合使用流程? 适合计算密集型任务。
比如图像处理。
或者数值模拟。
也有需要隔离环境的时候。
防止子进程崩溃影响主程序。

线程呢? 它是进程中的执行单元。
共享进程内存空间。
全局变量和文件句柄是共享的。

如何创建线程? 使用 threading.Thread 类。
比如这个例子: 蟒蛇 导入线程
def task(): print("线程执行")
thread = threading.Thread(target=task) 线程.start() 线程.join()
GIL 有什么影响? Python 解释器使用 GIL。
确保一次只有一个线程执行字节码。
所以CPU密集型任务中的多线程 没有性能提升。
但在 I/O 密集型任务中 效率会提高。

多线程和单线程有什么区别? I/O 密集型任务: 多线程可以提高效率。
当线程等待网络响应时 其他线程可以继续执行。

CPU密集型任务: 多线程受GIL限制 无法并行化。
性能与单线程几乎相同。
即使因为线程切换开销 也许甚至更低。

进程和线程的比较: 资源使用情况: 进程独立占用内存。
线程共享进程内存。

通讯: 进程之间的通信需要管道和队列。
直接访问线程之间的共享变量。
但需要同步机制。

稳定性: 进程崩溃不会影响其他进程。
线程崩溃可能会导致进程终止。

启动开销: 进程创建和切换的成本很高。
线程开销很小。

并行功能: 多个进程可以利用多核 CPU。
实现真正的并行。
多线程受GIL限制 同一时刻只有一个线程在执行。

多线程和进程选择哪一个? 多线程适合什么用途? I/O 密集型任务。
比如网络爬虫。
GUI 应用程序也可以工作。
需要频繁交互的场景。

什么适合多进程? CPU 密集型任务。
比如机器学习训练。
需要高隔离度的场景。

示例代码(多进程并行): 蟒蛇 from multiprocessing import Pool
def square(x): 返回 x x
如果 __name__ == '__main__': 将 Pool(4 ) 作为 p: 结果 = p.map(正方形, [1 , 2 , 3 , 4 ]) 打印(结果)输出:[1 ,4 ,9 ,1 6 ]
总结一下: 进程和线程资源隔离, 并行能力及适用场景 一切都不同。
I/O 任务的多线程 但受GIL限制。
多个进程可以并行运行 但资源开销较高。
开发者必须根据任务类型来决定 选择合适的并发模型。
没关系。

Python中,线程threading详解

用钥匙锁。
保护共享数据。
一次更改一个线程。
lock.acquire() 获取锁。
lock.release() 释放锁。
锁没有释放,线程休眠后释放。
num 值未修改,下一个线程编号为 1 00。
GIL 阻止解释器的全局级别。
限制一次执行一个线程。
阻塞问题。
线程竞争资源并互相中断。
无法继续执行。
死锁解决策略: 避免堵塞。
检测并恢复。
防止堵塞。
移除块。
重入锁(RLlock)。
同一线程多次请求同一资源。
维护内部锁和计数器。
计数器记录获胜次数。
在它们吸收所有释放后,其他线程获得资源。
红绿灯。
控制对有限资源的访问。
计数器代表可用资源的数量。
semaphore.acquire() 获取资源。
semaphore.release() 释放资源。
有效管理资源访问。
条件变量(Condition)。
链接到锁,共享资源被同步。
方法:buy()、release()、wait()、notify()、notifyAll()。
等待某些条件满足后再执行。
防止不必要的资源访问和等待。
事件阻塞对象。
线程之间的通信。
默认状态为 False。
Start 遇到 Event 对象并被阻止。
信号事件.set()。
方法:wait()、set()、clear()、isSet()。
线程之间的同步。
注意阻塞问题。
了解正确使用的关键。
练习案例掌握方法。

python线程阻塞的解决

哎,说起来,我以前也遇到过线程阻塞的问题,当时确实很头疼。
我记得那是2 01 8 年,我在一家初创公司从事后端开发。
当时,该公司推出了在线教育平台。
用户数量突然增加,后台线程的用户请求被阻塞。

我当时使用的方法是多线程,想通过创建多个线程来分担压力。
导致主线程阻塞后,所有线程都被卡住,整个系统响应速度非常慢。
现在我想,我需要找到一种方法,尽量减少她关闭主线程的机会。

所以我开始研究。
首先,我使用线程模块创建多个子线程,并将一些耗时的 I/O 操作(如数据库查询)转储到子线程中进行处理。
主线程负责执行一些轻量级任务。
但是这个问题并没有完全解决,因为线程之间的通信仍然存在问题,数据共享导致竞争条件。
有时,线程在处理数据之前检索数据。

后来想到用队列来解决这个问题,这样线程就可以通过队列传递数据,避免直接共享数据,问题也稍微好一些。
不过这种方法也有缺点,那就是效率不是很高,因为排队过程本身就有一定的利润。

然后我尝试使用asyncio来处理I/O密集型任务,并使用async/wait语法编写了一些异步代码,这样主线程就不会因为I/O操作而被阻塞。
但这种方式对网络请求的响应速度要求比较高。
如果网络延迟较大,结果就不太好。

后来我尝试为网络请求和线程锁都设置超时机制。
一旦通过,我就跳过它或者重试,这样至少程序不会因为等待而卡住。

最后,我使用信号量和状态变量来控制会议,防止资源过载,并控制状态协调。
这些方法虽然很复杂,但是确实很有效。

解决短线程关闭问题要根据具体情况而定。
有时有多个线程,有时是异步编程,有时是超时机制,有时是并发控制工具,有时是协程。
但归根结底,主线程还是为了不被阻塞,提高交换能力。
这个过程让我学到了很多。