问题标签 [event-driven]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - PHP:我是否将事件驱动编程与信号感知接口(信号和插槽/观察者模式)混为一谈?
我看到很多人说 Symfony2、Zend Framework 2 等都是事件驱动的。
在桌面世界中,通过事件驱动编程,我了解到应用程序将在其状态发生变化时通知其观察者。
由于 PHP 应用程序是无状态的,因此无法做到这一点。IE 在用户使用界面时让观察者绑定到视图观察变化。相反,它需要一个新的请求进程来更新视图。所以,这不是一个事件,而是一个全新的请求。
另一方面有一个类似的概念:事件驱动架构。
在这里你可以阅读:
http://en.wikipedia.org/wiki/Event-driven_programming
http://en.wikipedia.org/wiki/Event-driven_architecture
这里是另一个:
http://en.wikipedia.org/wiki/Signal_programming
信号是对发生事件的进程的通知。信号有时被描述为软件中断。信号类似于硬件中断,因为它们会中断程序的正常执行流程。在大多数情况下,无法准确预测信号何时到达。
- Stackoverflow [singals] 标签说明
而且,我以前所说的事件驱动,似乎和Qt引入的Signals and Slots Pattern(观察者模式实现)有更多的关系
例如,普拉多框架声称是事件驱动的:
http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Applications(应用程序生命周期部分)
http://www.pradosoft.com/docs/manual/System/TApplication.html#methodonEndRequest
IIRC,这不是一个事件驱动的应用程序,而只是实现observable Interface
. 我的意思是,考虑到桌面应用程序使用事件的方式和无状态应用程序使用事件的方式(作为插件):第一次使用整个应用程序的事件,包括视图,最后一次仅用于服务器端操作。
一种与面向方面的编程(带有信号和槽)更相关,另一种与横切关注点/AOP 无关。换句话说,它与应用程序状态更相关。
那么,这些术语之间的关系实际上是什么以及它们之间的区别是什么?
- 事件驱动编程
- 事件驱动架构
- 信号和槽模式
这些术语只是通用模式吗?因此,所有实现观察者模式的东西都可以被认为是事件驱动的吗?
更新
Zend 框架 2
我在上面链接的关于 AOP 的文章(http://mwop.net/blog/251-Aspects,-Filters,-and-Signals,-Oh,-My!.html)由 Matthew Weier O'Phinney 撰写(采埃孚领导者)。IIRC,它没有提到“事件驱动”,只是信号和插槽。
Symfony 2
Symfony2
EventDispatcher
组件描述没有提到“事件驱动”应用程序: http ://symfony.com/doc/current/components/event_dispatcher/introduction.html 它只包含对“事件”的引用(确实,由信号和插槽处理)。
两个框架似乎都在 Signal 和 Slots 中使用 Intercepting Filter Pattern 来处理请求过程中的同步事件。
javascript - 如何使用 Node.js 为游戏服务器创建双向持久性?
假设我们正在构建一个宇宙飞船游戏。一些物体类型是宇宙飞船和太阳系。我想使用 Node 作为后端。
我遇到的问题是如何使用回调/事件驱动系统使这两个对象都存在并实时交互。例如,一艘船如何不断地告诉系统它在该系统中的位置,而不是每隔几秒钟不断更新一个“位置”属性,该属性将在创建船时初始化。
或者两艘船将如何相互作用?位置,类型等都必须考虑。是否必须实现极其复杂的事件监听器?
也许我让这比需要的更困难。
extjs - Ext JS 中的事件驱动编程
我正在开发一个应用程序,其中来自不同插件的不同小部件将被加载到主机中,并且它们彼此不知道。所以我想使用 EDP 并在一个小部件中引发一个事件(例如,UserDeleted)并在另一个小部件中订阅该事件(著名的发布者/订阅者,或者让我们获得更具体的观察者模式)。
在 jQuery 中,我使用 trigger() 和 bind() 方法来完成此操作。但是,我无法在 Ext JS 中找到任何等效的东西。我错过了什么吗?或者是否有任何其他模式可以在 Ext JS 中创建松散耦合的 UI 小部件?
multithreading - 为什么线程如此昂贵,事件驱动的非阻塞 IO 在基准测试中更好
我最近开始学习 node.js,这是一个基于 V8 的 JavaScript 库,以其非阻塞 IO 和令人难以置信的速度而闻名。
据我了解,节点不会等待 IO 响应,而是运行一个事件循环(类似于游戏循环),不断检查未完成的操作并在 IO 响应后立即继续/完成它们。节点性能与 Apache HTTPD 相比,节点速度明显更快,同时使用更少的内存。
现在,如果您阅读有关 Apache 的信息,您会了解到它每个用户使用 1 个线程,这可能会显着减慢它的速度,这就是我的问题出现的地方:
如果将线程与节点在其事件循环中内部执行的操作进行比较,您会开始看到相似之处:两者都是等待资源响应的未完成进程的抽象,都检查操作是否定期进行,然后不占用CPU 一段时间(至少我认为一个好的阻塞 API 在重新检查之前会休眠几毫秒)。
现在,使线程变得如此糟糕的显着关键差异在哪里?
java - 使用基本设计模式模拟 Java 中的事件驱动编程模型
关于事件驱动的编程模型。通常雇主会提出“在没有任何外部库的情况下用 Java 模拟事件驱动的编程模型”的问题。我认为这是一个简单的问题,可以使用设计模式来回答。
我的解决方案是有 2 个队列作为发布订阅(又名观察者)通道。发布通道将注册针对特定事件类型的事件,例如点击。
轮询元素 -> 按钮 1 单击 || 按钮 1 再次单击 || 按钮 1 单击特定时间。<- 发布者队列
另一个订阅通道将存储事件侦听器,如果出现新的发布,
轮询元素 -> 侦听器 1 || 听者 2 || -<订阅者队列。
它将首先推入发布队列并在另一时间轮询它允许订阅者消费。订阅将使用发布者元素并应用于订阅者通道中的每个元素(在本例中为每个事件侦听器)。观察者设计模式允许组件不可知论。发布者对订阅者一无所知。
此方案类似于电子邮件通讯订阅。
在 OO 实现中,会有 Publishers 对象和 Subscribers 类。实际上是详细的发布者实现和详细的订阅者实现的队列。还结合了调解器设计模式来协调发布者类和订阅者类。
我的解决方案有任何缺陷吗?
perl - 如何将 AnyEvent::Handler 与具有端口重用的套接字一起使用
最近我遇到了一个很棒的 perl 模块“AnyEvent”,它允许用户进行异步/事件驱动的编程。
创建了以下代码片段,它工作正常。我遇到的问题是,在它打开和关闭大量套接字后,它很快耗尽了所有客户端端口(“netstat -ant”显示 20,000 多个套接字处于 TIME_WAIT 状态)。
我想知道是否可以使用 IO::Socket::INET 创建 TCP 套接字,然后在 AnyEvent::Handle 中使用新创建的套接字:
试过了,但它不起作用。感谢任何建议/意见。
感谢 ikegami 对此进行了调查并提出了建议。但是,似乎 SO_REUSEADDR 没有生效。这是我使用的代码(基于他的建议)
我的系统是 Ubuntu 11.04。在目录 /proc/sys/net/ipv4 中,以下是两个文件的内容:
% 更多 tcp_tw_recycle
1
% 更多 tcp_tw_reuse
1
php - PHP中的链接必须使用case语句吗?
我得到了一个学校项目,其中涉及用 PHP 创建一个在线发票系统。我的老师似乎确信拥有菜单(带有“显示”等固定页面)的唯一方法是使用案例陈述。我的第一个猜测是只使用一个回显一些href的函数。
他还一直说 PHP 是事件驱动的。这是真的?我一直认为服务器上的解释器会检查代码,然后将 html 发送到浏览器。
有任何想法吗?
java - 创建一个简单的事件驱动架构
目前有一个项目有点麻烦。我正在实现一个游戏,我希望它是事件驱动的。
到目前为止,我有一个 EventHandler 类,它有一个重载方法,具体取决于生成的事件类型(PlayerMove、Contact、Attack 等)
我将让游戏驱动程序或类生成事件。我的问题是如何在不将事件生成类与事件处理程序紧密耦合并使 EDA 的使用变得多余的情况下有效地处理事件?
我想设计自己的简单处理程序,而不是为此使用内置的 Java
asynchronous - '一个' IOLoop 如何处理 10k 连接?
很抱歉这个愚蠢的问题,但我真的很困惑;我希望你能纠正我哪里错了。
在基于线程的服务器(如 Apache)中,我知道对于每个客户端,将为他创建一个新的“工人”来满足他的所有需求。
在事件驱动(如 Nginx 和 Tornado)中,这让我感到困惑,尤其是像Python 的 GIL这样的Not Thread Safe;据我了解,只有一个循环可以处理所有客户端请求,所以据我所知,如果有 10 000 个同时连接,我不知道如何处理所有这 10 个请求!
php - PHP系统应该如何生成菜单链接?
我的计算机课程的一部分要求我构建一个完整的 PHP 系统。我选择为一家虚构的股票经纪公司创建一个,该公司希望其客户能够通过网络系统查看他们的资产(股票和债券)。
对于菜单,我的第一个想法是使用一些简单的“hrefs”,因为菜单将被固定为显示页面链接,如“查看股票;查看债券;我的帐户等”。但是,我的老师坚持不能使用“hrefs”,唯一可行的方法是使用 switch 语句(或者他称之为:case 语句)。这是真的?应该注意的是,我的老师几乎没有 PHP 经验,而且我们似乎对他所说的一切都发生了冲突(他一直在谈论 PHP 是事件驱动的并涉及系统循环等。我一直认为这是不真实的...... )。
那么,有人有什么建议吗?我应该违背他的意愿坚持使用“hrefs”,还是使用其他方法?