我刚刚使用Python将Express从NodeJS改为Django。我唯一想念NodeJS的是精彩的流程管理器pm2。我可以将pm2与Django一起使用吗?
答案 0 :(得分:3)
您可以定义pm2脚本,例如
pm2{name}.json
具有以下内容:
{
"apps": [
{
"name": "{name}",
"cwd": "/srv/{name}",
"args": "runserver",
"script": "manage.py",
"exec_mode": "fork",
"exec_interpreter": "python"
}
]
}

并使用pm2 start {name}
显然,您需要将{name}
替换为您项目的名称。
答案 1 :(得分:1)
这确实是一个非常广泛的问题,但我想个人的观点,因为我在我的项目中使用了两个框架。
表达(nodejs)到django(python)
Express和Django都是Web框架,但Node和Python不属于同一类别。你可以更好地说JS和Python。 Node是JS的运行时环境,因此像pm2这样的工具可以有效地管理Node进程。
对于基于Python的Web项目,您需要选择一种方式(接口)来为它们提供服务。常见的可能性有CGI和WSGI。
我不能谈论烧瓶,但Django推荐的方式是WSGI。有几个选项,包括mod_wsgi,uwsgi和gunicorn。任何控制其流程的工具都取决于您选择的工具。
从这个意义上讲,这是一个复杂程度。我建议你去探索所有这些,阅读它们,测试它们并选择最适合你需求的那个。
我个人更喜欢uwsgi,因为我发现它非常快,特别是在加载时,如果主机配置了这样,有时候会发生mod_wsgi(doh)。 UWSGI有一个excellent stats解决方案。
更不用说最终使用WSGI的服务器有很多工具。
话虽如此,对于简单的请求,您是否不会轻易达到节点的响应时间。但是当在节点中事情变得复杂(回调太多,查询太多等)时,时间变得非常相似。另一方面,只要你掌握了Django,你就会惊讶于你需要多少时间来编写和维护代码,而不是回调地狱和完全不成熟的Node数据层。
答案 2 :(得分:0)
步骤
(lldb) bt
* thread #36, name = 'VoiceProcessThread', stop reason = EXC_BAD_ACCESS (code=1, address=0xb00000001062662c)
* frame #0: 0x0000000100bee6d4 PortalApp`cricket::BaseChannel::SendPacket(bool, rtc::Buffer*, rtc::PacketOptions const&) + 204
frame #1: 0x0000000100bbbdd0 PortalApp`cricket::MediaChannel::DoSendPacket(rtc::Buffer*, bool, rtc::PacketOptions const&) + 96
frame #2: 0x0000000100be99a4 PortalApp`cricket::WebRtcVoiceMediaChannel::SendRtcp(unsigned char const*, unsigned long) + 108
frame #3: 0x0000000100db528c PortalApp`webrtc::voe::Channel::SendRtcp(unsigned char const*, unsigned long) + 132
frame #4: 0x0000000100d4de08 PortalApp`non-virtual thunk to webrtc::PacketContainer::OnPacketReady(unsigned char*, unsigned long) + 36
frame #5: 0x0000000100d3f894 PortalApp`webrtc::rtcp::RtcpPacket::BuildExternalBuffer(unsigned char*, unsigned long, webrtc::rtcp::RtcpPacket::PacketReadyCallback*) const + 80
frame #6: 0x0000000100d3f820 PortalApp`webrtc::rtcp::RtcpPacket::Build(webrtc::rtcp::RtcpPacket::PacketReadyCallback*) const + 60
frame #7: 0x0000000100d4d228 PortalApp`webrtc::RTCPSender::SendCompoundRTCP(webrtc::RTCPSender::FeedbackState const&, std::__1::set<webrtc::RTCPPacketType, std::__1::less<webrtc::RTCPPacketType>, std::__1::allocator<webrtc::RTCPPacketType> > const&, int, unsigned short const*, bool, unsigned long long) + 596
frame #8: 0x0000000100d4c614 PortalApp`webrtc::RTCPSender::SendRTCP(webrtc::RTCPSender::FeedbackState const&, webrtc::RTCPPacketType, int, unsigned short const*, bool, unsigned long long) + 112
frame #9: 0x0000000100d3e2ec PortalApp`webrtc::ModuleRtpRtcpImpl::Process() + 972
frame #10: 0x0000000100ea3d6c PortalApp`webrtc::ProcessThreadImpl::Process() + 188
frame #11: 0x0000000100ceebb8 PortalApp`rtc::PlatformThread::Run() + 76
frame #12: 0x0000000100ceeb60 PortalApp`rtc::PlatformThread::StartThread(void*) + 12
frame #13: 0x00000001943e82c0 libsystem_pthread.dylib`_pthread_body + 128
frame #14: 0x00000001943e8220 libsystem_pthread.dylib`_pthread_start + 44
frame #15: 0x00000001943ebcdc libsystem_pthread.dylib`thread_start + 4
npm install npm@latest -g
pm2 start echosystem.config.json
Description of echosystem.config.json
如果必须更改django应用程序的端口号,则可以更改
{
apps:
[{
name: "djnago_with_pm2",
script: "manage.py",
args: ["runserver", "127.0.0.1:8000"],
exec_mode: "fork",
instances: "1",
wait_ready: true,
autorestart: false,
max_restarts: 5,
interpreter : "python"
}]
}
文件的args属性中的端口号。
完成echosystem.config.json
文件中的更改后,使用
列表项
pm2这样的命令:
echosystem.config.json
//此命令将停止所有服务器。pm2 stop all
//如果您知道pm2 id,请执行以下命令。pm2 stop 0
//再次启动django应用程序。从此处django_with_pm2下载完整的示例项目
答案 3 :(得分:-1)
{
"apps": [
{
"name": "{name}",
"cwd": "/srv/{name}",
"args": "runserver",
"script": "manage.py",
"exec_mode": "fork",
"exec_interpreter": "python"
}
]
}
&#13;