在 PHP 中使用 pthreads 创建异步超时

2024-04-16

我正在尝试在 PHP 中创建某种异步超时。

我使用 PECL 扩展 pthreads 来实现多线程。

异步超时工作正常,但参考却不然。

我使用 PHP 5.5.8 进行此测试。

class ParentClass {
    public $test;

    public function __construct(){
    }

    public function test() {
        echo $this->test;
    }
}

class Timeout extends Thread {
    private $seconds;
    private $parent;

    public function __construct($seconds, &$parent){
        $this->seconds = $seconds;
        $this->parent = $parent;
    }

    public function run(){
        sleep($this->seconds);
        $this->parent->test();
    }
}

$parent = new ParentClass();
$parent->test = "Hello.\n";
$timeout = new Timeout(2, $parent);
$timeout->start();
$parent->test = "Bye.\n";
$parent->test();

期待

Bye.
Bye.

Getting

Bye.
Hello.

有人可以告诉我我做错了什么吗?


对于多线程应用程序,不应使用 sleep(),PHP 调用的底层实现旨在导致进程休眠,而不是进程内的线程休眠。里程会有所不同,某些实现很可能会导致线程休眠,但您不能也不应该依赖它。

usleep 更适合多线程,因为它旨在使线程休眠,而不是进程休眠,但是,它也会使线程处于非接收状态。

pthreads 内置了专为多线程设计的适当同步方法,使线程在等待某些事情发生时处于接收状态。

引用不起作用,也不必起作用,如果您希望在多个上下文之间传递对象进行操作,则该对象应该来自 pthread。

<?php
define("SECOND", 1000000);

class ParentClass extends Stackable {

    public function test() {
        echo $this->test;
    }

    public function run(){}

    public $test;
}

class Timeout extends Thread {

    public function __construct($seconds, $parent){
        $this->seconds = $seconds;
        $this->parent = $parent;
    }

    public function run(){
        $this->synchronized(function(){
            $this->wait(
                SECOND * $this->seconds);
        });
        $this->parent->test();
    }

    private $seconds;
    private $parent;
}

$parent = new ParentClass();
$parent->test = "Hello.\n";
$timeout = new Timeout(2, $parent);
$timeout->start();
$parent->test = "Bye.\n";
$parent->test();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PHP 中使用 pthreads 创建异步超时 的相关文章

  • PHP 和 DOM 文档

    我有一个关于 DOMDocument 的使用和创建 XML 的问题 我有一个 PHP 程序 加载到 XML 文件中 处理XML的每个节点 行 将其发送到另一个进程 然后该进程返回一个 XML 元素 我获取节点的字符串表示形式 以便可以创建
  • curl 无法获取网页内容,为什么?

    我正在使用curl 脚本转到链接并获取其内容以进行进一步操作 以下是链接和curl脚本
  • 在 Python 中打印守护线程异常

    Python 不会打印守护线程中引发的异常的回溯消息 例如 以下代码创建一个守护线程并在新线程中引发异常 def error raiser raise Exception import threading thread threading
  • PHP语言问题

    我有一个 php 页面 它将邮件发送到特定电子邮件 其中包含此页面表单中的数据 邮件必须以网站的母语 阿拉伯语 发送 但是当我单击表单上的提交按钮时 收到的邮件一半可读 阿拉伯语 另一部分不可读 符号 我想知道如何解决这个问题并且能够发送邮
  • 如何销毁一个物体?

    据我所知 很少 有两种方法 var new object Then Method 1 Set to null var null Method 2 Unset unset var 还有其他更好的方法吗 我在这里吹毛求疵吗 您正在寻找unset
  • 从单个 javascript 函数向两个不同的 PHP 脚本发送两个 Ajax 请求

    是否可以同时向两个或多个 Php 脚本发送 Ajax 请求 我知道这可以串行实现 从 1 获取响应 然后从另一个获取响应 但我想知道是否可以同时实现 请协助我使用以下代码 function calShowUpload if http rea
  • ajax 会增加还是降低安全性?

    我正在创建一个网站 到目前为止它是纯 PHP 的 我在想 既然很少有人没有启用 JavaScript 我想知道为什么 也许我应该将我的网站创建为一个完全 PHP 的网站 而不使用任何 AJAX 难道是我想错了 可以肯定的是 如果我实施一些
  • Mongodb $push 嵌套数组

    我想向我的嵌套数组添加新数据 我的文档是 username erkin email email protected cdn cgi l email protection password b playlists id 58 name asd
  • 何时使用 pthread 条件变量?

    线程问题 看来 只有在其他线程调用 pthread cond notify 之前调用 pthread cond wait 时 条件变量才起作用 如果在等待之前发生通知 那么等待将被卡住 我的问题是 什么时候应该使用条件变量 调度程序可以抢占
  • .htaccess 在动态文件夹名称中加载索引

    我在 htaccess 加载动态文件夹名称中的索引时遇到问题 这是我的目录结构 root products gt this is constant folder name 而不是使用 GET 获取产品 url root products i
  • 对更改运行 PHPUnit 测试

    每当磁盘上的文件发生更改时 我想运行 PHPUnit 测试 或至少其中的一个子集 与您可以使用 进行的操作非常相似 咕噜手表 https github com gruntjs grunt contrib watch blob master
  • Lumen 微框架 => php artisan key:generate

    我正在尝试 PHP 微框架 Lumen 来自 Laravel 我的第一步就是调查 env example文件并复制一份以供我使用 env文件 就像 Laravel 中一样 有一个变量 APP KEY 现在我尝试了简单的命令php artis
  • 计算轮班工作时间并检测

    我有个问题 我的英语很差 我需要用PHP做一个加班计算 已经有一个代码可以实现这一点 但当工作时间超过2天时 计算就会出错 工作开始 2018 09 09 13 43 工作结束 2018 09 11 07 13 结果 07 18 04 00
  • 如何让Symfony2直接加载CSS、JS文件而不是通过PHP?

    老问题 请参阅下面的更新版本 我的开发环境不是最快的 每个 PHP 请求大约需要 500 毫秒 它开始成为 Symfony2 资源文件的问题 因为每个资源文件都是通过 Symfony 的内部控制器请求的 http localhost myp
  • 使用 Flot、html、PHP 和 MySql 查询绘制多个图表

    我正在尝试使用 Flot html PHP 和 MySql 查询绘制多个图表 但我陷入了困境 因为我找不到在同一个 html 页面中绘制多个 flot 的方法 为简单起见 在数据库 test db3 映像中包含以下字段 表1 用户名 发送邮
  • 从 Handler.obtainMessage() 获取什么参数

    我正在使用线程来执行一些 BT 任务 我正在尝试向 UI 线程发送消息 以便我可以基于我的 BT 线程执行 UI 工作 为此 我使用处理程序 但我不知道如何检索发送到处理程序的数据 要发送数据 我使用 handler obtainMessa
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • 如何根据另一个下拉列表中的选择动态填充下拉列表中的选项?

    我有一个表 其中包含类别信息 例如产品 我已将它们列在下拉菜单中 现在 我需要做的是 在下一个下拉菜单中列出所选类别的子类别 我希望 javascript 是必需的 但我对 javascript 还不太熟悉 将非常感谢您的帮助 你应该使用
  • 在 Windows 上查看 PHP 文件夹

    我正在编写一个简单的 PHP 脚本来监视文件夹及其子文件夹的任何更改 新文件 修改 删除 然后执行操作 我将使用 Windows 上的命令行运行此脚本php f script php 我一直在寻找一种在 Windows 上观看具有 PHP
  • 使用 md5 加密的 PHP 和 Mysql 查询出现问题

    我使用普通的 php mysql 插入查询并使用 md5 加密密码 这是插入查询 sql mysql query INSERT INTO user username password role approved values usernam

随机推荐

  • 将 Android Studio 项目更新为 Kotlin 1.3

    我正在尝试使用 Kotlin 协程runBlocking函数 但我收到错误 该方法是在 Kotlin 1 3 中引入的 因此 我尝试更新我的 Android Studio 项目以使用 Kotlin1 3 0 但是 当我这样做时 我收到错误
  • 了解 Gemfile.lock:删除 Gemfile.lock 然后再次运行捆绑安装是否可以?

    我们会对此进行测试 但如果不应该发生这种情况 我们不想冒险破坏我们的开发环境 删除Gemfile lock可以吗 我们使用的是 Rails 3 0 6 您可能不会破坏您的开发环境 但是 您最终可能会得到比以前更新版本的宝石 这取决于你如何定
  • 如何从 C# 将生成的 pdf 文件作为电子邮件附件发送?

    我有生成 pdf 文件的代码 我想将其作为电子邮件的附件发送 我有这个代码 FileContentResult fileContentResult File fileName application pdf file pdf 我有这个代码可
  • 绑定到具有可选值类型的 SOAP 服务

    我有一个使用以下代码生成 SOAP 服务的方法WSDL
  • 如何使表单中的值文本变为斜体

    我有一个脚本 当用户单击字段时 它会删除表单中的默认值文本 但如何使值文本以斜体显示 如果我将 css 中的输入更改为 font style italic 那么当用户键入时 它也会以斜体显示 我只希望 预览文本 为斜体 然后在用户键入时正常
  • 使用 sqlalchemy 从 PostgreSQL 查询返回 Pandas 数据帧

    我想查询 PostgreSQL 数据库并将输出作为 Pandas 数据框返回 我使用 SqlAlchemy 创建了与数据库的连接 from sqlalchemy import create engine engine create engi
  • 是否可以在 C++ 中禁用 stderr?

    我使用 libxml2 为 html 解析编写了一个 Linux 程序 尽管 html 解析器完成了它的工作 但它还是将许多不同的错误写入 stderr 是否可以完全禁用 stderr 或将其重定向到 dev null 而不必使用重定向 s
  • PHP如何在弹出模式中获取用户ID(变量)

    许多员工及其信息显示在页面上 员工信息通过数据库检索 然后通过foreach 循环用于显示符合搜索条件的所有员工 示例如下图所示 现在 当用户单击按钮时 会触发一个简单的 Bootstrap 弹出模式 其中包含一些基本表单字段 从下面的示例
  • 如果过去 60 分钟的交易量小于 x,如何在 Seyren with Graphite 中发出警报?

    我正在使用 Graphite Statsd 带有 Python 客户端 从 Web 应用程序收集自定义指标 成功交易的计数器 假设计数器是stats transactions count 还有一个每秒速率指标stats transactio
  • 链接器输入文件未使用的 c++ g++ make 文件

    我无法弄清楚是什么导致了我在制作项目时不断遇到的错误 i686 apple darwin11 llvm g 4 2 lncurses linker input file unused because linking not done 我的
  • 自执行功能不起作用?

    我有代码 function i alert i 3 我不明白为什么我看不到警报 这个语法是什么意思 以及为什么这段代码 function i alert i 3 有效吗 有什么不同 我缺少什么 第一个片段将被解释为函数声明 它需要一个名称
  • gitlab-ci.yml&docker-in-docker(dind)&curl 在共享运行器上返回连接被拒绝

    我正在尝试创建一个简单的 GitLab CI 在其中使用 docker compose up 启动一个容器 然后尝试使用curl 访问它 最后使用 docker compose down 将其拆除 docker compose up 旋转得
  • 使用小数分隔符和千位分隔符验证小数

    您好 我使用这个正则表达式来验证带有小数分隔符和千位分隔符的数字 ets eds 0 9 ets eds 0 9 但是这个fail 它不应该接受 对于我的两个单元测试用例 12 and 1 2 有人可以帮忙吗 注意 这项工作适用于1 2 让
  • 如何使用node.js驱动程序复制mongodb集合?

    有没有办法通过 Node js mongodb 驱动程序复制集合 i e collection copyTo duplicate collection 您可以评估copyTo 服务器端虽然它会阻止整个 mongod 进程并且不会在新集合上创
  • 中小型 .NET 应用程序的数据库(和 ORM)选择

    我需要开发一个基于 NET 的应用程序 其数据需求可能超过 SQL 2005 Express Edition 的 4 gig 限制 由于内部 DBA 的专业知识 同一应用程序的其他客户 将来 可能需要使用特定的数据库平台 例如 Oracle
  • 在 Rails 表单错误消息中显示链接

    在我们的注册表单上 我们validates uniqueness of email 当用户尝试使用我们的注册表单并指定现有的电子邮件地址时 我希望他们看到这样的错误消息 该邮件地址已被使用 如果您在登录时遇到问题 您可以重置你的密码 htt
  • 如何计算闰年?

    我对闰年有一些疑问 如何通过使用这样的公式来确定 add years function x y if isTRUE all equal y round y stop Argument y must be an integer n x lt
  • UIImageview 以快速编程方式

    我只是想创建一个UIImage以编程方式查看 我有一个新视图 我尝试这样做 let imageName yourImage png view backgroundColor UIColor colorWithPatternImage UII
  • 如何使用maven pom.xml创建jar

    我需要一个示例 pom 文件来为我的 spring 项目创建 jar 文件 创建jar文件时如何指定创建资源的目录和文件夹 我可以使用 pom jar 文件创建 jar 文件 但我需要将 applicationContext xml 包含在
  • 在 PHP 中使用 pthreads 创建异步超时

    我正在尝试在 PHP 中创建某种异步超时 我使用 PECL 扩展 pthreads 来实现多线程 异步超时工作正常 但参考却不然 我使用 PHP 5 5 8 进行此测试 class ParentClass public test publi