繁体   English   中英

同时进行多个流程

[英]More than one process at the same time

嘿,我现在正在学习Python。 我写了一些程序。 现在我有一个问题:是否可以一次运行更多的“操作”? 据我所知,脚本是从上到下运行的(除了像def和if语句之类的东西)。


例如:我想做某事,然后等待5秒钟,然后继续,但是当我的程序“等待”时,它应该做其他事吗? (这很简单)或者:在检查输入时执行其他输出操作。

这些例子非常糟糕,但我目前还没有发现更好的例子。 (如果有什么想法,我稍后再补充)。希望您理解我的问题。

干杯

TL; DR:使用异步方法。 雷蒙德·海廷格(Raymond Hettinger)是位上帝, 这次演讲比我能更准确,更彻底地解释这个概念。 ;)

您描述的行为称为“并发性”或“异步性”,其中您有多个“同时”执行的“一段”代码。 这是实用计算机科学中最难解决的问题之一,因为增加时间的维数不仅会导致逻辑问题,还会导致调度问题。 但是,由于多核处理器和互联网固有的并行环境,近来需求很大

用引号引起“同时”,因为有两种基本方法可以实现此目的:

  1. 实际在同一时间运行代码
  2. 使它看起来像在同时运行。

第一个选项称为并发编程,第二个选项称为异步编程(通常为“异步”)。

通常,“现代”编程似乎更喜欢异步,因为它更易于推理,并且陷阱更少,不太严重。 如果操作正确,异步程序可能看起来很像您已经熟悉的同步过程代码。 Golang基本上是基于该概念构建的。 Javascript以Promises和async / await的形式接受了“未来”。 我知道它不是Python,但是Go的创建者的演讲很好地概述了这一哲学。

Python提供了三种主要的处理方式,分为三个主要模块: threadingmultiprocessingasyncio

多处理线程是并发解决方案。 它们做的事情非常相似,但是通过以不同的方式委派给操作系统以不同的方式完成它们。 这个答案有一个简洁的解释。 众所周知,并发性很难调试,因为它不是确定性的 :时间上的微小差异会导致完全不同的执行顺序。 您还必须处理线程中的“竞争条件”,其中两位代码要同时读取/更改相同的共享状态。

asyncio或“异步输入输出”是一种较新的异步解决方案。 您至少需要Python 3.4。 它使用事件循环来执行长时间运行的任务,而不会“阻塞”程序的其余部分。 进程和线程做类似的事情,通过周期性地中断正在运行的进程,迫使它们轮流在同一处理器内核上运行两个或多个操作。 但是通过异步, 您可以决定转弯发生的位置。 这就像设计一个可以互动的成熟成年人,而不是设计必须由OS照看并被迫共享处理器的幼稚园。

还有一些第三方软件包,例如geventeventlet ,它们早于asyncio并可以在Python的早期版本中使用。 如果您有能力将Python设置为> = 3.4,我建议您仅使用asyncio ,因为它是Python核心的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM