Concurrency In Python 简明教程
Concurrency vs Parallelism
并发性和并行性都用于多线程程序,但对于它们之间的相似性和差异存在很多混淆。这方面的重大问题是:并发性是并行性还是不是?尽管这两个术语看起来非常相似,但对上述问题的答案是否定的,并发性和并行性并不相同。现在,如果它们不相同,那么它们之间的基本区别是什么?
简单来说,并发性处理从不同线程访问共享状态,而并行性处理利用多个 CPU 或其内核来提高硬件性能。
Barriers of Concurrent Systems
Sharing of data
在实现并发系统时的一个重要问题是多个线程或进程之间的数据共享。实际上,程序员必须确保锁保护共享数据,以便对其的所有访问都序列化,并且一次只能有一个线程或进程访问共享数据。如果多个线程或进程都尝试访问同一共享数据,那么并非全部,但至少其中一个将被阻塞并且仍处于空闲状态。换句话说,我们可以说,当锁处于强制状态时,我们将一次只能使用一个进程或线程。有一些简单的解决方案可以消除上述障碍:
Data Structure Assistance
很多时候,并发进程需要同时访问相同的数据。除了使用显式锁之外,另一个解决方案是使用支持并发访问的数据结构。例如,我们可以使用 queue 模块,它提供线程安全的队列。我们还可以使用 multiprocessing.JoinableQueue 类进行基于多处理的并发性。
Sharing of I/O Resources
在实现并行系统时的另一个重要问题是由线程或进程使用 I/O 资源。当一个线程或进程长时间使用 I/O 而另一个处于空闲状态时,会出现问题。我们在使用 I/O 密集型应用程序时可以看到这种类型的障碍。可以借助示例来理解它,即从网络浏览器请求页面。它是一个重量级应用程序。在此,如果请求数据的速度低于使用数据的速度,那么我们的并发系统中就有 I/O 障碍。
以下 Python 脚本用于请求网页并获取网络获取请求页面的时间 -
import urllib.request
import time
ts = time.time()
req = urllib.request.urlopen('https://www.tutorialspoint.com')
pageHtml = req.read()
te = time.time()
print("Page Fetching Time : {} Seconds".format (te-ts))
执行上述脚本后,我们可以获得页面获取时间,如下所示。
What is Parallelism?
可以将并行性定义为将任务拆分为可以同时处理的子任务的艺术。它与上面讨论的并行性相反,其中两个或更多事件同时发生。我们可以用图表理解它;一个任务被分解成可以在并行中处理的多个子任务,如下所示:
为了更深入地了解并行性和并发性之间的区别,请考虑以下几点:
Understanding of the processors for implementation
我们了解并发性、并行性和它们之间的区别,但我们应该了解在哪些系统上实现它们。非常有必要了解我们将要实现的系统,因为这使我们可以在设计软件时做出明智的决策。我们有两个类型的处理器 -