Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 睡眠的最佳实践_Php_Multithreading_Theory - Fatal编程技术网

Php 睡眠的最佳实践

Php 睡眠的最佳实践,php,multithreading,theory,Php,Multithreading,Theory,假设您有一个写入文件的进程,执行该进程只需1秒。在文件上放置锁以防止在写入时写入;然而,这个问题应该适用于任何比赛条件。最好是循环检查或等待信号,例如PHP中的pcntl_sigwaitinfo和pcntl_信号 如果首选循环和检查,为了获得最佳性能,等待接收锁的进程应该休眠多长时间,或者换句话说,进程应该多久唤醒一次以检查锁的状态 假设CPU周期时间为20纳秒ns: 如果等待1整秒钟,则最大浪费时间为1s-1ns,或者假设上一个进程在上次检查后1ns完成,则浪费时间几乎为整秒钟。然而,过于频繁

假设您有一个写入文件的进程,执行该进程只需1秒。在文件上放置锁以防止在写入时写入;然而,这个问题应该适用于任何比赛条件。最好是循环检查或等待信号,例如PHP中的pcntl_sigwaitinfo和pcntl_信号

如果首选循环和检查,为了获得最佳性能,等待接收锁的进程应该休眠多长时间,或者换句话说,进程应该多久唤醒一次以检查锁的状态

假设CPU周期时间为20纳秒ns:

如果等待1整秒钟,则最大浪费时间为1s-1ns,或者假设上一个进程在上次检查后1ns完成,则浪费时间几乎为整秒钟。然而,过于频繁的检查也是浪费。我正在考虑使用

 [ ( Execution Time / (4 * Execution Time) ]. 

考虑到执行的长度,此公式应减少到检查的4倍。你们怎么想?

我真的无法理解你们到底想做什么,所以我会做一些假设

我假设您锁定文件是为了保持内容的完整性,而不是创建某种基于文件的条件,因为您不需要文件来满足条件

<>我假设你忽略了循环和检查是一种引入种族条件的好方法,考虑下面的代码

if (can_lock_file())
    lock_file();
如果执行多个上下文,我假设这是由于问题上的多线程标记,那么您基本上是在编程一个死锁-如果两个上下文同时调用can_lock_file,它们都可以得到正返回值,并且都尝试锁定文件,阻塞或死锁其中一个上下文,取决于代码

最好的建议是不要在代码中做出这样的决定,没有好的方法可以让它正确

下面是一些代码,它有8个线程将随机生成的数据写入单个输出文件,该文件的完整性通过互斥体以正确的方式保留,数据和过程的性质将决定实际互斥体的使用方式,我猜测:

<?php

class FileWriter extends Thread {
    public function __construct($file, $lock) {
        $this->file = $file;
    }

    public function run() {
        /* the file does not need to be locked while data is generated */
        $data = [];
        while (count($data) < 1000) {
            $data[] = md5(mt_rand()*microtime());
        }

        $tid = $this->getThreadId();

        foreach ($data as $line) {
            /* the lock need only be held while the file is written */
            Mutex::lock($this->lock);
            fprintf(
                $this->file,
                "%s#%lu: %s\n", __CLASS__, $tid, $line);
            Mutex::unlock($this->lock);
        }
    }

    protected $file;
    protected $lock;
}


$threads = [];
$thread = 0;

$handle = fopen("test.txt", "w+");
$lock = Mutex::create();

while ($thread<8) {
    $threads[$thread] = new FileWriter($handle, $lock);
    $threads[$thread]->start();
    $thread++;
}

foreach ($threads as $thread)
    $thread->join();


Mutex::destroy($lock);
?>

如果需要信号量,我希望避免等待和发出信号,因为它们在PHP中不是跨平台的。对于文件系统,我不是专家,但这对于PHP来说似乎太低级了。平均执行时间是从测试中收集的,而不是通过实时计算。S.O的目标是实用的,而不是理论上的,令人惊讶的是,我的过程实际上平均只需要1秒钟。检查前我应该睡多久?我认为一个公式将有助于扩大答案。。。为什么“理论”是一个固定的标签?