cursedcoder / eprocess
多线程框架吗?
0.5
2016-04-13 06:25 UTC
Requires
- php: >=5.6
- concerto/comms: ~0.8
- cursedcoder/emessenger: ^0.1.0
- doctrine/collections: ~1.3
- jms/serializer: ^1.1
- mkraemer/react-pcntl: ^2.0
- react/react: ~0.4@dev
- symfony/process: ^3.0
Requires (Dev)
- divi/pthreads-stub: dev-master
- phpunit/phpunit: ^5.3
README
想法是拥有多个非阻塞上下文,并内置透明的进程间通信。
这个库只是一个原型,请自行承担风险使用。
查看 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);
您需要设置适当的自动加载才能使用此示例。