显然,您可以通过两种不同的方式创建以Twisted方式运行的服务.一方面,您可以使用Twisted Application Infrastructure创建服务,另一方面,您可以使用Twisted Plugin System创建服务.看起来除了在命令行上启动应用程序的方式有些不同,以及编写实际服务的方法之外,它们有两种方法可以完成同样的事情?
我正在尝试Pypy因为它在CPython上显示出令人印象深刻的基准.另外,我主要在代码中使用Twisted库.我现在可以运行一个使用Twisted reactor的基准脚本,所以我猜我的设置很好.但是,我不知道如何使用Pypy运行Twisted daemonizer(twistd).
我创建了一个很好的 python Twisted 应用程序,其中包含一个用于 Twisted 运行器的插件,如 Twisted 文档中所述:http : //twistedmatrix.com/documents/current/core/howto/tap.html。我在使用 PyInstaller 打包时遇到问题:在执行冻结的应用程序期间找不到我的 twistd 插件。
为了发布我的项目,我使用twisd runner 模块创建了我自己的顶级启动脚本,例如
#!/usr/bin/env python
from twisted.scripts.twistd import run
from sys import argv
argv[1:] = [
'--pidfile', '/var/run/myapp.pid',
'--logfile', '/var/run/myapp.log',
'myapp_plugin'
]
run()
Run Code Online (Sandbox Code Playgroud)
接下来,我使用 PyInstaller 将其冻结为单个目录部署。执行上面的冻结脚本失败,因为它找不到我的扭曲插件(为简洁而编辑):
~/pyinstall/dist/bin/mystartup?16632/twisted/python/modules.py:758:
UserWarning: ~/pyinstall/dist/mystartup?16632 (for module twisted.plugins)
not in path importer cache (PEP 302 violation - check your local configuration).
~/pyinstall/dist/bin/mystartup: Unknown command: myapp_plugin
Run Code Online (Sandbox Code Playgroud)
通常,Twistd 会检查 Python 系统路径以在 twined/plugins/myapp_plugin.py 中发现我的插件。如果我在启动脚本中打印了 twind 插件列表,则该列表在 PyInstaller 生成的可执行文件中为空,例如
from twisted.plugin import IPlugin, getPlugins …Run Code Online (Sandbox Code Playgroud) 我在应用程序bin部署/usr/bin期间编写了一个Twisted 文件,基于AxiomStackOverflow 上其他地方提供的示例(我不记得在哪里),可以在这里找到项目.
我的问题是,在此python setup.py install过程中,安装的bin文件与Axiom包中的文件不同:
在/ usr/bin中/不言自明
#!/code/venv/bin/python
from axiom.scripts import axiomatic
axiomatic.main()
Run Code Online (Sandbox Code Playgroud)
在/ usr/bin中/ MYAPP
#!/code/venv/bin/python
# EASY-INSTALL-DEV-SCRIPT: 'MyApp==0.0.1','myapp'
__requires__ = 'MyApp==0.0.1'
__import__('pkg_resources').require('MyApp==0.0.1')
exec(compile(open(__file__).read(), __file__, 'exec'))
Run Code Online (Sandbox Code Playgroud)
从bash shell调用后者时后者不起作用: myapp start
我收到以下错误: unknow command myapp
如果我使用python setup.py develop而不是python setup.py install一切顺利.
我已经设置了一个小测试应用程序,它在端口1234上启动tcp服务:
twistd finger 有效,服务启动fingerize start(故意使用不同的名称,以确保不会调用错误的名称)不起作用这是代码:
斌/ fingerize
#!/usr/bin/python
from finger import tap
tap.main()
Run Code Online (Sandbox Code Playgroud)
扭转/插件/ finger_plugin.py
from twisted.application.service import …Run Code Online (Sandbox Code Playgroud) 我在Twisted的twistd.py脚本顶部注意到以下内容:
import os, sys
try:
import _preamble
except ImportError:
sys.exc_clear()
sys.path.insert(0, os.path.abspath(os.getcwd()))
Run Code Online (Sandbox Code Playgroud)
怎么import _preamble办?我似乎无法在google-mage上找到它的任何引用.
我的基于Twisted的客户端在循环中发送UDP数据包.因此我使用的是DatagramProtocol类.这是来源:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from twisted.application.service import Service
from twisted.internet import reactor
from twisted.internet.task import LoopingCall
from twisted.internet.protocol import DatagramProtocol
from twisted.python import log
import logging
class HeartbeatClient(Service):
def __init__(self, host, port, data, beat_period):
self.ip = host
self.port = int(port)
self.data = data
self.beat = int(beat_period)
def startService(self):
self._call = LoopingCall(self._heartbeat)
self._call.start(self.beat)
def stopService(self):
self._call.stop()
def _heartbeat(self):
protocol = DatagramProtocol()
protocol.noisy = False
port = reactor.listenUDP(0, protocol)
port.write(self.data, (self.ip, self.port))
port.stopListening()
Run Code Online (Sandbox Code Playgroud)
现在当我用twistd运行这个客户端时,我永久地从Twisted类中获取日志消息,即从类DatagramProtocol获取:
2011-09-11 18:39:25+0200 [-] (Port 55681 …Run Code Online (Sandbox Code Playgroud) 我需要一种可靠的方法来检查通过twistd(和TAC文件)启动的基于Twisted的服务器是否已成功启动.它可能会失败,因为某些网络选项设置错误.由于我无法访问twistd日志(因为它记录到/ dev/null,因为我不需要log-clutter twistd产生),我需要找出服务器是否在启动脚本中成功启动了扭曲的电话.
launch-script是一个像这样的Bash脚本:
#!/usr/bin/bash
twistd \
--pidfile "myservice.pid" \
--logfile "/dev/null" \
--python \
myservice.tac
Run Code Online (Sandbox Code Playgroud)
我在网上找到的只是使用ps或类似东西的一些黑客.但我不喜欢这样的方法,因为我觉得它不可靠.
所以我在考虑是否有办法访问Twisted的内部,并获得所有当前正在运行的Twisted应用程序?这样我就可以在当前运行的应用程序中查询我的Twisted应用程序的名称(正如我在TAC文件中命名的那样)来启动.
我也在考虑不使用扭曲的可执行文件,而是实现基于Python的启动脚本,其中包含了扭曲的内容,就像这个问题的答案所提供的那样,但我不知道这是否有助于我获得状态服务器运行.
所以我的问题就是:是否有一种可靠的非丑陋的方式来判断Twisted Server启动时是否已成功启动了twistd,当禁用了twistd-logging时?
我有扭曲的服务器.它与插件一起运行.我想根据请求为每个条目写独特的前缀.
这意味着当user1发出请求时,它将生成一个唯一的字符串,该字符串将以日志记录为前缀(仅适用于此请求).当user2发出请求时,它将成为日志记录的另一个唯一前缀.
我认为它应该是log observer logger,但是如何在用户请求之间分组记录?
在flask doco 中,显示了在twisd 下部署flask 应用程序的以下描述。
twistd web --wsgi myproject.app
Run Code Online (Sandbox Code Playgroud)
我有一个看起来像这样的 foo.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
Run Code Online (Sandbox Code Playgroud)
所以我希望能够像这样在扭曲下运行
twistd web --wsgi foo.app
Run Code Online (Sandbox Code Playgroud)
但twisdd 不喜欢那样(只是吐出帮助文本)。
我究竟做错了什么 ?
顺便说一句,万一我在 virtualenv 中运行它(我已经安装了flask和twisted)和当前目录,当我发出twisd命令包含 foo.py 。
编辑:我使用的扭曲版本是 18.7.0
我没有注意到(直到 Peter Gibson 的评论提示)在帮助文本出现后会出现消息“No such WSGI application:'foo.app'”。