您好我正在寻找一种在 php 文件中实现协程的方法。这个想法是我有很长的流程,需要能够在可能的几个小时或几天内产生结果。因此,其他 php 文件将调用与协程相同的文件中的函数来更新某些内容,然后调用类似的函数$coroutine.process()
会导致协程从其最后一次产量继续。这是为了避免必须使用大型状态机。
我在想协程 php 文件在空闲时实际上不会运行,但是当给定处理时间时,它将从顶部进入并使用 switch 或 goto 之类的东西从以前的产量重新启动。然后,当它达到下一个产量时,文件会将其当前状态保存在某处(如会话或数据库),然后退出。
有没有人听说过这个,或者类似的比喻?以某种方式在一个集合下聚合和管理多个协程的奖励积分,也许支持类似线程的连接,以便在它们完成时流在一个地方继续(有点像 Go)。
更新:php 5.5.0 增加了对生成器和协程的支持:
https://github.com/php/php-src/blob/php-5.5.0/NEWS
https://wiki.php.net/rfc/generators
我还没有尝试过,所以也许有人可以提出一个准系统的例子。我正在尝试将状态机转换为协程。因此,例如,for 循环中的 switch 命令(其流程难以遵循,并且随着添加更多状态而容易出错)转换为协作线程,其中每个决策点在有序的线性流程中很容易看到,该流程暂停yield 关键字的状态变化。
一个具体的例子是,假设你正在编写一个电梯控制器。不是根据电梯的状态(STATE_RISING、STATE_LOWERING、STATE_WAITING 等)确定是否读取按钮的状态,而是编写一个带有子循环的循环,该循环在电梯处于每种状态时运行。所以当它上升时,它不会下降,它不会读取除紧急按钮之外的任何按钮。这可能看起来没什么大不了的,但在像聊天服务器这样的复杂状态机中,几乎不可能在不引入细微错误的情况下更新状态机。而协作线程(协程)版本具有明显可见的流程,更易于调试。