将pm2与Django一起使用

时间:2017-01-06 14:52:32

标签: python django pm2

我刚刚使用Python将Express从NodeJS改为Django。我唯一想念NodeJS的是精彩的流程管理器pm2。我可以将pm2与Django一起使用吗?

4 个答案:

答案 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项目,您需要选择一种方式(接口)来为它们提供服务。常见的可能性有CGIWSGI

我不能谈论烧瓶,但Django推荐的方式是WSGI。有几个选项,包括mod_wsgi,uwsgi和gunicorn。任何控制其流程的工具都取决于您选择的工具。

从这个意义上讲,这是一个复杂程度。我建议你去探索所有这些,阅读它们,测试它们并选择最适合你需求的那个。

我个人更喜欢uwsgi,因为我发现它非常快,特别是在加载时,如果主机配置了这样,有时候会发生mod_wsgi(doh)。 UWSGI有一个excellent stats解决方案。

更不用说最终使用WSGI的服务器有很多工具。

话虽如此,对于简单的请求,您是否不会轻易达到节点的响应时间。但是当在节点中事情变得复杂(回调太多,查询太多等)时,时间变得非常相似。另一方面,只要你掌握了Django,你就会惊讶于你需要多少时间来编写和维护代码,而不是回调地狱和完全不成熟的Node数据层。

答案 2 :(得分:0)

步骤

  • 从给定的link安装节点
  • 在命令提示符/终端reference中使用此命令安装npm
(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
  • 运行此命令以在服务器计算机上不间断地执行django应用程序
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)

&#13;
&#13;
 {
  "apps": [
    {
      "name": "{name}",
      "cwd": "/srv/{name}",
      "args": "runserver",
      "script": "manage.py",
      "exec_mode": "fork",
      "exec_interpreter": "python"
    }
  ]
}
&#13;
&#13;
&#13;