- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个使用 Twisted Python IRC 协议(protocol)编写的 IRC 机器人。我希望能够在运行命令的同时仍然允许机器人同时监听和执行其他命令。
例如,假设我有将一个大文本文件打印到 channel 的命令。如果我想在命令运行时通过在 channel 中输入“!stop”来停止命令,我该如何实现呢?或者假设我想在一个 channel 中执行“!print largefile”,然后转到另一个 channel 并键入“!print anotherfile”并让它在完成第一个文件的打印之前将该文件打印到另一个 channel 。
我在想我会为此目的使用线程吗?我不太确定。
编辑(澄清):
def privmsg(self, user, channel, msg):
nick = user.split('!', 1)[0]
parts = msg.split(' ')
trigger = parts[0]
data = parts[1:]
if trigger == '!printfile':
myfile = open('/files/%s' % data[0], 'r')
for line in myfile:
line = line.strip('/r/n')
self.msg(channel, line)
if trigger == '!stop':
CODE TO STOP THE CURRENTLY RUNNING PRINTFILE COMMAND
如果我想同时在两个 channel 中运行 !printfile
或在运行时停止 printfile 命令,我应该怎么做?
最佳答案
您不能中断 printfile 命令的原因是它包含一个遍历文件全部内容的循环。这意味着 privmsg
函数将一直运行,直到它读取并发送了文件中的所有行。只有在完成该工作后,它才会返回。
Twisted 是一个单线程协作多任务系统。一次只能运行程序的一部分。在您的 irc bot 可以处理来自 irc 服务器的下一行输入之前,privmsg
必须返回。
但是,Twisted 还擅长处理事件和管理并发。因此,这个问题的一个解决方案是使用 Twisted 中包含的一种工具(而不是 for 循环)发送文件——一种与系统其余部分协作并允许同时处理其他事件的工具。
这是一个简短的示例(未经测试,并且有一些明显的问题(例如当两个 printfile 命令到达得太靠近时的不良行为),我不会在这里尝试修复):
from twisted.internet.task import cooperate
....
def privmsg(self, user, channel, msg):
nick = user.split('!', 1)[0]
parts = msg.split(' ')
trigger = parts[0]
data = parts[1:]
if trigger == '!printfile':
self._printfile(channel, data[0])
if trigger == '!stop':
self._stopprintfile()
def _printfile(self, channel, name):
myfile = open('/files/%s' % (name,), 'r')
self._printfiletask = cooperate(
self.msg(channel, line.rstrip('\r\n')) for line in myfile)
def _stopprintfile(self):
self._printfiletask.stop()
这使用了 twisted.internet.task.cooperate
,这是一个辅助函数,它接受一个迭代器(包括生成器)并以与应用程序其余部分协作的方式运行它们。它通过迭代迭代器几次,然后让其他工作运行,然后返回迭代器,依此类推,直到迭代器耗尽。
这意味着即使正在发送文件,来自 irc 的新消息也会被处理。
但是,要考虑的另一点是 irc 服务器通常包含防洪保护,这意味着向它们快速发送许多行可能会使您的机器人断开连接。即使在最好的情况下,irc 服务器也可能会缓冲这些线路,并且只会缓慢地将它们全部释放到网络中。如果 bot 已经发送了这些行并且它们位于 irc 服务器的缓冲区中,您将无法通过告诉 bot 停止来阻止它们出现在网络上(因为它已经完成)。而且,正因为如此,Twisted 的 irc 客户端也有缓冲,所以即使在你调用 self.msg
之后,该行可能实际上被发送,因为 irc 客户端是缓冲线以避免发送它们太快以至于 irc 服务器将 bot 踢出网络。因为我写的代码只处理对 self.msg
的调用,如果它们都已经进入 irc,你可能仍然无法阻止发送行客户端的本地缓冲区。
所有这些问题的一个明显(也许不理想)的解决方案是通过在那里插入一个新的延迟来稍微复杂化 _printfile
中使用的迭代器:
from twisted.internet import reactor
from twisted.internet.task import deferLater
def _printfileiterator(self, channel, myfile):
for line in myfile:
self.msg(channel, line)
yield deferLater(reactor, 2, lambda: None)
def _printfile(self, channel, name):
myfile = open('/files/%s' % (name,), 'r')
self._printfiletask = cooperate(self._printfileiterator(channel, myfile))
在这里,我更改了迭代器,以便从中出来的元素是 deferLater
中的 Deferred(之前,元素都是 None
,因为那是self.msg
的返回值)。
当 cooperate
遇到 Deferred
时,它将停止在该迭代器上工作,直到 Deferred
触发。以这种方式使用的deferLater
基本上是一个协作 sleep 函数。它返回一个 Deferred
,直到 2 秒后才会触发(然后它以 None
触发,cooperate
并不特别关心关于)。在它触发后,cooperate
将继续在迭代器上工作。所以现在 _printfile
每两秒只发送一行,这将更容易用停止命令中断。
关于python - Twisted Python IRC Bot - 如何在 bot 运行命令时监听命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11752673/
我正在尝试发送 RFC5424 中定义的结构化数据从 Twisted 到系统日志。我在 Ubuntu 上,系统日志实现是 rsyslog。 我正在使用“twistd --syslog”运行扭曲的应用程
摘要:无法自动向 Twisted 的检修孔发出命令。寻求解决方案/建议。 Twisted 有一个很棒的功能,称为 manhole。它允许用户通过 ssh 连接到当前正在运行的 Twisted 服务器并
我正在尝试发送 RFC5424 中定义的结构化数据从 Twisted 到系统日志。我在 Ubuntu 上,系统日志实现是 rsyslog。 我正在使用“twistd --syslog”运行扭曲的应用程
我正在尝试使用扭曲的 spawnProcess 启动一个进程,并使用 psutil 每 5 秒记录一次资源使用情况。首先,我尝试使用以下代码获取生成的进程的可执行文件名称: #!/usr/bin/py
Azure 网站能否托管 Twisted 应用程序?例如像这样的东西: from twisted.internet import reactor from twisted.web import ser
有没有办法限制 Twisted http 客户端的下载速率?如果没有,在 Twisted 中实现此类客户端的最简单方法是什么? 最佳答案 Twisted 中的流控制最常使用 IProducer.pau
我的基于 Twisted 的客户端循环发送 UDP 数据包。因此,我正在使用 DatagramProtocol 类。这是来源: #!/usr/bin/python # -*- coding: utf-
raven 有很多集成,包括 python 日志记录。一方面,twisted 不使用python 的日志记录。而另一方面,在twisted 中,raven 并没有直接的整合。 那么在基于扭曲的设置中使
有人告诉我,Twisted基于库Ampoule是创建在不同计算机上执行的进程池的好方法。然而,没有相关文档,Ampoule 的示例也没有说明这一点。 我对类似于 stdlib multiprocess
Twisted 最近推出了一个新的日志记录模块:twisted.logger。我已经通读了文档 [1],但我一直无法找到设置实际日志级别的位置。关于日志观察者[2] 的部分建议,如果您显式配置自己的
我想问一个关于如何关闭扭曲连接的问题 RPC . 我知道有人问过类似的问题,但似乎没有回答我的问题。 我正在做一些基本的连接,如下图所示: cfactory = pb.PBClientFactory(
我正在使用 Twisted 编写代码,但在为我的扭曲互联网延迟变量想出一个合理的变量名时遇到了麻烦。这是我的候选人: d :太通用,太短,违反了 pylint 规则 C0103。 def :与内置函数
我正在为 Web 服务器的静态部分使用 Twisted Web static.File 资源。 对于开发,我希望能够添加新文件或修改当前静态文件,而无需重新启动 Twisted 网络服务器。 我在 g
我想使用 Twisted 重建现有应用程序的通信部分。这个应用程序确实从客户端向服务器发送数据,只是这样,服务器不发送任何东西。 我如何使用 Twisted 的事件驱动概念来实现这一目标?我目前使用
我开始考虑通过扩展当前的 Twisted FTP 来实现显式 FTP。 大部分代码都很简单,实现 AUTH、PBSZ、PROT 很容易,我得到了一个有效的安全控制 channel 。 我的问题是数据通
我想实现 WebRTC 对等连接。我不知道如何设置 ICE 服务器或应该使用什么工具。任何人都可以给我建议吗?非常感谢。 最佳答案 实际上你不需要编写自己的 STUN/TURN 服务器 有很多现成的解
正如标题所示,ProcessProtocol 类上的这两个函数有什么区别?关于什么时候应该使用一种而不是另一种的文档有点稀疏? 我最好寻找一些可以证明这一点的用例示例。 最佳答案 我猜文档在这一点上有
使用下面的代码,我似乎可以相当轻松地使用 multiprocessing.reduction 在子进程中重建套接字.. import socket,os import multiprocessing
我正在尝试在 python 上使用 twisted 编写服务器。这是我文件的头部: from twisted.internet.protocol import Factory, Protocol fr
我使用 Twisted 制作了一个简单的 http 服务器,它发送 Content-Type: multipart/x-mixed-replace header 。我正在使用它来测试我想设置为接受长期
我是一名优秀的程序员,十分优秀!