同时有多个进程

时间:2018-01-31 21:20:56

标签: python

嘿,我正在学习Python。我写了一些程序。现在我有一个问题: 是否可以立即运行更多“操作”? 根据我的知识,脚本从顶部到底部运行(除了称为def和if语句之类的东西等)。

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

这些例子非常糟糕,但我目前还没有找到更好的东西。 (如果我想到了什么,我会稍后再添加) 我希望你明白我的问题是什么。

干杯

1 个答案:

答案 0 :(得分:0)

TL; DR:使用异步方法。 Raymond Hettinger是一位神,this talk比我更准确,更彻底地解释了这个概念。 ;)

您描述的行为称为“并发”或“异步”,您可以“同时”执行多个“段”代码。这是实际计算机科学中最难的问题之一,因为除了逻辑问题之外,添加时间维度会导致调度问题。然而,由于多核处理器和互联网固有的并行环境,现在需求量很大

“同时”是引号,因为有两种基本方法可以实现这一点:

  1. 实际上同时运行代码
  2. 让它看起来就像是在同一时间运行。
  3. 第一个选项称为并发编程,第二个选项称为异步编程(通常为“异步”)。

    一般来说,“现代”编程似乎更倾向于异步,因为它更易于推理,并且具有更少,更少严重的陷阱。如果你做得对,异步程序看起来很像你已经熟悉的同步程序代码。 Golang基本上建立在这个概念之上。 Javascript以Promises和async / await的形式接受了“未来”。我知道这不是Python,但是Go的创建者this talk给出了很好的哲学概述。

    Python为您提供了三种主要方法,分为三个主要模块:threadingmultiprocessingasyncio

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

    asyncio 或“异步输入输出”是一种更新的异步解决方案。你至少需要Python 3.4。它使用事件循环来允许长时间运行的任务执行而不“阻塞”程序的其余部分。进程和线程做类似的事情,通过定期中断运行进程,甚至在同一处理器核上运行两个或多个操作,迫使它们轮流。但是使用异步,决定轮流发生的地方。这就像设计成熟的成年人一样,互相合作,而不是设计必须由操作系统坐下来的幼儿园儿童,并被迫分享处理器。

    还有geventeventlet等第三方软件包早于asyncio并在早期版本的Python中运行。如果你有能力定位Python> = 3.4,我建议你只使用asyncio,因为它是Python核心的一部分。