Php 睡眠的最佳实践
假设您有一个写入文件的进程,执行该进程只需1秒。在文件上放置锁以防止在写入时写入;然而,这个问题应该适用于任何比赛条件。最好是循环检查或等待信号,例如PHP中的pcntl_sigwaitinfo和pcntl_信号 如果首选循环和检查,为了获得最佳性能,等待接收锁的进程应该休眠多长时间,或者换句话说,进程应该多久唤醒一次以检查锁的状态 假设CPU周期时间为20纳秒ns: 如果等待1整秒钟,则最大浪费时间为1s-1ns,或者假设上一个进程在上次检查后1ns完成,则浪费时间几乎为整秒钟。然而,过于频繁的检查也是浪费。我正在考虑使用Php 睡眠的最佳实践,php,multithreading,theory,Php,Multithreading,Theory,假设您有一个写入文件的进程,执行该进程只需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秒钟。检查前我应该睡多久?我认为一个公式将有助于扩大答案。。。为什么“理论”是一个固定的标签?