php pthreads并使用类来存储线程

时间:2015-11-04 10:32:19

标签: php multithreading pthreads

我对PHP很新,现在对pthreads来说还是新手。

我正在使用最新的PHP7 RC6版本,使用git / src构建的pthreads来获取最新版本(并试用了'官方'v3.0.8版),在Ubuntu 3.13.0-66-generic

我正在尝试编写一个线程化解决方案来从套接字中读取数据并对其进行处理。我正在使用线程来尝试最大化我的性能,主要是因为我正在进行像http请求(到AWS DynamoDB和其他服务)这样的操作,等待来自外部系统的响应,因此我可以从中受益螺纹。

我的真实代码比这更复杂。这是一个显示我的问题的简单示例。

我要做的是将某些信息“缓存”在我从数据库(AWS DynamoDB)获取的“数组”中,以便我可以获得更好的性能。我需要每个线程能够使用/访问和修改这个“全局”缓存,并在缓存中使用多个“记录”。

我在测试方面取得了巨大的成功,并且只是以这种方式存储字符串,但现在我正在实现它,我需要存储更复杂的数据,我决定为每条记录使用一个小类(cacheRecord)而不是简单的数据串。但问题是,当我尝试将一个值赋给一个类成员时,它似乎不想“保存”,返回到数组。

我设法通过将整个'class'复制到tmp变量,修改它,然后将整个类保存回数组来实现它,但这似乎是代码的开销,我也需要将它包装在 - > synchronized中以保持线程之间的完整性。

这是正确执行此操作的唯一方法,将其复制到tmp并将其复制回并使用“synchronized”,还是我做了其他错误/愚蠢的事情?

尝试使用它,我使cacheRecord类'extends Threaded'。这使得成员的单个赋值工作正常,但这使它成为不可变的,我以后无法在缓存中取消/删除该记录。

显示我的意思的代码:

<?php

class cacheRecord {
    public $currentPos;
    public $currentRoom;
    public $someOtherData;
}

class cache extends Threaded {
    public function run() {}
}

class socketThread extends Thread {

    public function __construct($myCache) {
        $this->cacheData = $myCache;
    }

    public function run() {

        // This will be in a loop, waiting for sockets, and then responding to them, indefinitely.

        // At some point, add a record to the cache
        $c = new cacheRecord;
        $c->currentPos = '1,2,4';
        $c->currentRoom = '2';
        $this->cacheData['record1'] = $c;

        var_dump($this);

        // Later on, update the cache record, but this doesnt work
        $this->cacheData['record1']->currentRoom = '3';

        var_dump($this);

        // However this does work, but is this the correct way? Seems like more code to execute, than a simple assign, and obviously, I would need to use synchronized to keep integrity, which would further slow it down.

        $tmp = $this->cacheData['record1'];
        $tmp->currentRoom = '3';
        $this->cacheData['record1'] = $tmp;

        var_dump($this);

        // Later on some more, remove the record
        unset($this->cacheData['record1']);

        var_dump($this);

        // Also will be using ->synchronized to enforce integrity of certain other operations
        // Just an example of how I might use it

/*
        $this->cacheData->synchronized(function() {
            if ($this->cacheData['record1']->currentRoom == '3') {
                $this->cacheData['record1']->Pos = '0,0,0'; // Obviously this wont work as above.
                $this->cacheData['record1']->currentRoom = '4';
            }
        });
*/
    }
}

// Main

$myCache = new cache;

for ($th=0;$th<1;$th++) { // Just 1 thread for testing
    $socketThreads[$th] = new socketThread($myCache);
    $socketThreads[$th]->start();
}

1 个答案:

答案 0 :(得分:1)

extends \ Threaded是要走的路。 然而,&#34;任何事情&#34;在缓存中应该从这扩展,而不仅仅是缓存itsef。

在手册的某处解释(遗憾的是不记得确切位置),而不仅仅是volatile(又称为线程)对象不会是不可变的。

因此,如果你的类cacheRecord没有从线程扩展,它将是不可变的,甚至是另一个线程结构。

线程使内部属性数组自动变为volatile(因此可以线程使用),但如果它们不是从线程扩展的话,则不是对象。

尝试从线程扩展cacheRecord并告诉我它是否有效。

  • 菲尔+