严重bug,定时器阻塞了端口监听!怎么办?

dingfei

1.只开启了一个线程。同时有定时器任务和端口监听
2.定时器每一秒执行一次。但是代码会执行2秒,导致定时器接连不断的运行,端口发来的数据无法响应。
怎么办?怎么实现:定时器执行完一次之后,先处理端口的任务然后再执行下一次定时器任务 ?
 
代码:


$inner_http_worker = new Worker('http://0.0.0.0:1598');
$inner_http_worker->count = 1; //进程数

// 当http客户端发来数据时触发添加任务
$inner_http_worker->onMessage = array($this, 'onMessage');
//$inner_http_worker->onMessage = function ($http_connection, $data) {
$inner_http_worker->onWorkerStart = array($this, 'onWorkerStart');

// 执行监听

$inner_http_worker->listen();
Worker::runAll();
    public function onWorkerStart(){
        Timer::add(1, array($this, 'workerloop'),[],true);
    }

    /**
     * 监听techs
     */
    public function onMessage($http_connection, $data){
                  echo  '收到下载数据的请求,';
    }
    /**
     * 定时执行任务
     */
    public function workerloop(){
        echo "每1秒执行一次';
        sleep(2);
    }
 ```
 
 
2752 1 0
1个回答

抽不完的寂寞

把定时任务丢其它进程去做。
定时任务这么慢当然不能和socket请求放一起执行

  • dingfei 2019-05-07

    必须要放一起。接收socket请求就是为了改变定时器里面的变量

  • dingfei 2019-05-07

    定时器里面加载了一个大型数组,占用内存5个G,需要通过发送socker请求去改变里面的变量。怎么办?怎么让进程运行一次定时任务之后 优先处理socker 请求?

  • 抽不完的寂寞 2019-05-07

    定时器由无限执行改成一次性定时器,一次性定时器里面在结束的时候再次添加下一次要执行的一次性定时器,这样估计可以

  • dingfei 2019-05-12

    @2710:牛逼,非常好。这样是解决了问题。

  • dingfei 2019-05-12

    @2710: 不过这样有一个问题,需要定时执行的代码会大大延后。 如何可以多进程并发,多个进程可以共享这5G的内存中的数组?

  • 抽不完的寂寞 2019-06-27

    这种单进程就好了吧,多进程共享数据在写数据和读数据的时候都要加锁,性能很差的,可能还没但进程性能高。

年代过于久远,无法发表回答
🔝