- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个现有的程序,它有自己的主循环,并根据它接收到的输入进行计算——比方说来自用户的输入,以使其简单。我现在想远程而不是本地进行计算,我决定在 Twisted 中实现 RPC。
理想情况下,我只想更改我的一个函数,比如 doComputation()
,调用 twisted 来执行 RPC、获取结果并返回。程序的其余部分应该保持不变。但是,我怎样才能做到这一点?当我调用 reactor.run()
时,Twisted 劫持了主循环。我还读到你并没有真正扭曲线程,所有任务都按顺序运行,所以我似乎不能只创建一个 LoopingCall 并以这种方式运行我的主循环。
最佳答案
您有几个不同的选择,具体取决于您现有程序的主循环类型。
如果它是来自 GUI 库的主循环,Twisted may already have support for it .在这种情况下,您可以继续使用它。
您也可以编写自己的 react 堆。没有很多很好的文档,但是 you can look at the way that qtreactor在 Twisted 外部实现一个 react 器插件。
您还可以使用 threadedselectreactor
编写一个最小 react 器。这方面的文档也很少,但是 the wxpython reactor是用它来实现的。就我个人而言,我不推荐这种方法,因为它很难测试并且可能会导致困惑的竞争条件,但它确实具有让您利用几乎 Twisted 的所有默认网络代码的优势,只需一个薄的包裹层。
如果您确实不希望您的doComputation
是异步的,并且您希望您的程序在等待Twisted 回答时阻塞,请执行以下操作:
twistedThread = Thread(target=reactor.run); 之类的东西twistedThread.start()
RPCDoer
),以便您可以引用它。确保使用 reactor.callFromThread
实际启动其 Twisted 逻辑因此您不需要包装它的所有 Twisted API 调用。RPCDoer.doRPC
返回 Deferred ,仅使用 Twisted API 调用(即不调用您现有的应用程序代码,因此您无需担心应用程序对象的线程安全;传递 doRPC
它需要的所有信息作为参数)。您现在可以像这样实现 doComputation
:
def doComputation(self):
rpcResult = blockingCallFromThread(reactor, self.myRPCDoer.doRPC)
return self.computeSomethingFrom(rpcResult)
reactor.callFromThread(reactor.stop); twistedThread.join()
来自主循环的关闭过程,否则您可能会在退出时看到一些令人困惑的回溯或日志消息。最后,您应该真正考虑的一个选项,尤其是从长远来看:转储现有的主循环,并想出一种只使用 Twisted 的方法。根据我的经验,对于 10 个这样的问题中的 9 个,这是正确的答案。我并不是说这总是要走的路 - 在很多情况下,您确实需要保留自己的主循环,或者只是需要付出太多努力才能摆脱现有循环。但是,维护自己的循环也是可行的。请记住,Twisted 循环已经过数百万用户的广泛测试,并用于各种环境。如果您的循环也非常成熟,那可能没什么大不了的,但如果您正在编写一个小的新程序,那么可靠性的差异可能会很大。
关于python - 在扭曲中使用我自己的主循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3303600/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!