cursedcoder / eprocess

多线程框架吗?

0.5 2016-04-13 06:25 UTC

This package is not auto-updated.

Last update: 2024-09-24 04:04:44 UTC


README

Build Status

想法是拥有多个非阻塞上下文,并内置透明的进程间通信。

这个库只是一个原型,请自行承担风险使用。

查看 examples/ 目录中的示例。

功能

  • 3个适配器:子进程(react)、pthreads、symfony进程(未测试)
  • 子进程与父进程之间使用Unix套接字进行进程间通信
  • 对象(jms serializer)、数组、标量的简单序列化
  • 异步事件驱动流程(react事件循环)
  • 与框架的集成,有关Symfony,请参阅 EProcess\Application\ContainerApplication
  • 子工作进程可以有自己的子工作进程(即 main -> worker -> worker ...

安装并尝试

  • git clone https://github.com/cursedcoder/eprocess
  • cd eprocess
  • composer install
  • php examples/simple.php

示例解释了功能

请注意,下面的代码片段仅用于说明目的,可能无法正常工作(或至少目前还不能)。

有关真实示例,请参阅 exampes/simple.php 及相关内容。

use EProcess\Application\Application;
use EProcess\Application\ApplicationFactory;

class Data
{
  // jms serializer metadata
  private $id;
  // setters getters etc.
}

class Main extends Application // like that one in c++
{
    public function run()
    {
        $worker = $this->createWorker(MyWorker::class); // create external non-blocking thread of MyWorker class
        $worker->send('any_event', 'Hello my worker!');
        $worker->on('hello_master', function() {
            // Receive back-call from child
        });
    }
}

class MyWorker extends Application
{
    public function run()
    {
        $this->on('any_event', function($data) {
            echo 'Got any_event event from my master: ' . $data; // data == Hello my worker
            // Still we can send any event back to master
            $this->send('hello_master');
            $this->send('send-any-data', new Data()); // you can send any object, array or scalar
            // object should have jms serializer metadata to be serialized
        });
        
        $this->getSubscribedEvents();
    }
}

ApplicationFactory::launch(Main::class);

您需要设置适当的自动加载才能使用此示例。