fliglio/borg

Fliglio Borg

2.3.4 2020-06-18 14:16 UTC

README

Build Status Latest Stable Version

Fliglio.Borg

Fliglio\Borggoroutines(由 golang 推广)的实现,为 PHP 提供一个分布式并行并发框架。

如果你是 Borg 集体的成员,你就不会自己做什么。你不会自己做决定,不会自己解决问题,当然也不会自己工作——你会在集体中分配工作量!

现在你也可以这样做。

待办事项/注意事项

下一步

  • 支持向 Chans 和集体程序发送 null
    • 使行为符合典型的 PHP 习惯(见此处
  • 添加 sync 概念
    • 集体程序调度返回一个退出 Chan
    • 每个集体程序在这个 Chan 上发送异常的 null
    • 主进程调用 sync,传入一个退出 Chans 的数组;这将阻塞,直到所有都返回一个值。如果值是一个异常,它将被重新抛出。

其他

  • 集体程序必须是精确类型。你不能用接口提示你的方法,并传入一个实现(提示用于反序列化参数。)
  • 只有集体程序是多云数据中心感知的。Chans 只能在你的本地数据中心使用。
  • 尽管 Chan 排序始终得到保证,但 ChanReader 引入了一些奇怪之处,其中发布到不同 Chans 的消息可能会以错误的顺序读取(见下文)
  • Chan::get 通过轮询 basic_get 实现。迭代使用 basic_consume 会更好

ChanReader

ChanReader 存在竞态条件,其中无法保证通道之间的顺序。在下面的示例中,即使 $ex 在所有数字添加到 $ch 后被添加,$ex 的值可能会先到达 ChanReader。在这种情况下,请考虑向 $ch 发送一个 null 来表示工作已完成。

public function generateNumbers(GetParam $limit) {
	$ch = $this->mkChan();
	$ex = $this->mkChan();

	$this->coll()->gen($ch, $ex, $limit->get());
	
	$nums = [];

	$r = $this->coll()->mkChanReader([$ch, $ex]);
	while (true) {
		list($id, $val) = $r->get();
		switch ($id) {
		case $ch->getId():
			$nums[] = $val;
			break;
		case $ex->getId():
			return $nums;
		}
	}
}
public function gen(Chan $ch, Chan $ex, $limit) {
	for ($i = 0; $i <= $limit; $i++) {
		$ch->add($i);
	}

	// sleep for a second to avoid the possibility that the $ex value is read before $ch's last value
	sleep(1); 
	
	$ex->add(true);
}

本地莎士比亚

$this->urlsd = [
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-alls-11.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-antony-23.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-as-12.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-comedy-7.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-coriolanus-24.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-cymbeline-17.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-first-51.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-hamlet-25.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-julius-26.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-king-45.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-life-54.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-life-55.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-life-56.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-lovers-62.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-loves-8.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-macbeth-46.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-measure-13.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-merchant-5.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-merry-15.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-midsummer-16.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-much-3.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-othello-47.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-pericles-21.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-rape-61.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-romeo-48.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-second-52.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-sonnets-59.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-taming-2.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-tempest-4.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-third-53.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-timon-49.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-titus-50.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-tragedy-57.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-tragedy-58.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-troilus-22.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-twelfth-20.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-two-18.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-venus-60.txt',
	__DIR__ . '/../../../../shakespeare-txt/shakespeare-winters-19.txt',
	__DIR__ . '/../../../../shakespeare-txt/sonnets.txt',
];