python多线程处理图像速度没变

Python016

python多线程处理图像速度没变,第1张

图像速度没变原因:

1、速度有点慢,需要做并行加速。

2、这应该是线程阻塞导致的。

3、可能会出现要显示的图像一闪而逝的问题。

Python由荷兰数学和计算机科学研究学会的GuidovanRossum于1990年代初设计,作为一门叫做ABC语言的替代品,Python提供了高效的高级数据结构,还能简单有效地面向对象编程。

Semaphore 对象内部管理一个计数器,该计数器由每个 acquire() 调用递减,并由每个 release() 调用递增。计数器永远不会低于零,当 acquire() 发现计数器为零时,线程阻塞,等待其他线程调用 release() 。

Semaphore 对象支持上下文管理协议。

方法:

acquire(blocking=True, timeout=None)

获取信号。

当 blocking=True 时:如果调用时计数器大于零,则将其减1并立即返回。如果在调用时计数器为零,则阻塞并等待,直到其他线程调用 release() 使其大于零。这是通过适当的互锁来完成的,因此如果多个 acquire() 被阻塞, release() 将只唤醒其中一个,这个过程会随机选择一个,因此不应该依赖阻塞线程的被唤醒顺序。

返回值为 True 。

当 blocking=False 时,不会阻塞。如果调用 acquire() 时计数器为零,则会立即返回 False .

如果设置了 timeout 参数,它将阻塞最多 timeout 秒。如果在该时间段内没有获取锁,则返回 False ,否则返回 True 。

release()

释放信号,使计数器递增1。当计数器为零并有另一个线程等待计数器大于零时,唤醒该线程。

实现有界信号对象。有界信号对象确保计数器不超过初始值 value ,否则抛出 ValueError 。

大多数情况下,该对象用于保护有限容量的资源。

栗子:

运行结果:

可以看到 Thread-3 是在 Thread-0 释放后才获得信号对象。

竞争条件 是并发编程中的一个重要问题。当一个线程试图修改共享资源 的同时, 另一个线程正在修改该资源时,就会出现这种情况——这会导致输出乱码,这就是线程需要同步的原因。

Python的threading模块包括 Lock 作为同步工具。锁有两种状态:

可以使用该acquire()方法锁定锁。一旦一个线程获得了锁,所有后续的获取锁的尝试都会被阻塞,直到它被释放。可以使用该release()方法释放锁。

以下代码通过一个简单的示例展示了如何在 Python 中使用锁:

假设银行账户中有 100 美元。每个月存入 10 美元作为利润,扣除 10 美元支付账单。thread1用于存入利润,而thread2用于支付账单。在某些月份,利润会在账单支付后存入。但是,这不应影响帐户中的最终金额。

由于 竞争条件下 ,以下代码得到的结果可能不正确。可能会出现一个线程在上下文切换前无法将更新后的值写入共享变量deposit,而另一个线程读取到未更新的值的情况;因此,导致不可预测的结果。

运行以上代码,将输出

acquire()和release()方法之间的代码是 原子 执行的,因此在另一个线程已经进行更改之后,一个线程不可能读取未更新的版本。

运行以上程序,将输出: