Скрученные зависания при демонизации - PullRequest
3 голосов
/ 17 февраля 2011

Я новичок в витом мире, поэтому сначала я пытаюсь настроить мой рабочий проект django, настроенный под twisted, в настоящее время он хорошо работает на сервере тестирования django или apache через mod_wsgi.

Я перешел по этой ссылке и по этой для настройки установки, исходя из того, что у меня есть файл server.py, указанный ниже

Итак, в-для интеграции приложения django с витой я использовал следующий код,

import sys
import os

from twisted.application import internet, service
from twisted.web import server, resource, wsgi, static
from twisted.python import threadpool
from twisted.internet import reactor
from django.conf import settings
import twresource # This file hold implementation of "Class Root".


class ThreadPoolService(service.Service):
    def __init__(self, pool):
        self.pool = pool

    def startService(self):
        service.Service.startService(self)
        self.pool.start()

    def stopService(self):
        service.Service.stopService(self)
        self.pool.stop()

class Root(resource.Resource):
    def __init__(self, wsgi_resource):
        resource.Resource.__init__(self)
        self.wsgi_resource = wsgi_resource

    def getChild(self, path, request):
        path0 = request.prepath.pop(0)
        request.postpath.insert(0, path0)
        return self.wsgi_resource

PORT = 8080

# Environment setup for your Django project files:
#insert it to first so our project will get first priority.
sys.path.insert(0,"django_project")
sys.path.insert(0,".")

os.environ['DJANGO_SETTINGS_MODULE'] = 'django_project.settings'
from django.core.handlers.wsgi import WSGIHandler

def wsgi_resource():
    pool = threadpool.ThreadPool()
    pool.start()
    # Allow Ctrl-C to get you out cleanly:
    reactor.addSystemEventTrigger('after', 'shutdown', pool.stop)
    wsgi_resource = wsgi.WSGIResource(reactor, pool, WSGIHandler())
    return wsgi_resource


# Twisted Application Framework setup:
application = service.Application('twisted-django')

# WSGI container for Django, combine it with twisted.web.Resource:
# XXX this is the only 'ugly' part: see the 'getChild' method in twresource.Root

wsgi_root = wsgi_resource()
root = Root(wsgi_root)

#multi = service.MultiService()
#pool = threadpool.ThreadPool()
#tps = ThreadPoolService(pool)
#tps.setServiceParent(multi)
#resource = wsgi.WSGIResource(reactor, tps.pool, WSGIHandler())
#root = twresource.Root(resource)


#Admin Site media files
#staticrsrc = static.File(os.path.join(os.path.abspath("."), "/usr/haridas/eclipse_workplace/skgargpms/django/contrib/admin/media/"))
#root.putChild("admin/media", staticrsrc)

# Serve it up:
main_site = server.Site(root)
#internet.TCPServer(PORT, main_site).setServiceParent(multi)
internet.TCPServer(PORT, main_site).setServiceParent(application)

#EOF.

Использование вышеприведенного кода. Он работал хорошо из командной строки, используя "витая -ny server.py", но когда мы запускаем его как демон "twisted -y server.py "зависнет, но приложение прослушивает порт 8080. Я могу получить к нему доступ через telnet.

Я нашел некоторые исправления для этой проблемы с зависанием из самого stackoverflow.Это помогло мне использовать приведенные ниже разделы кода, которые прокомментированы в приведенном выше файле server.py.

multi = service.MultiService()
pool = threadpool.ThreadPool()
tps = ThreadPoolService(pool)
tps.setServiceParent(multi)
resource = wsgi.WSGIResource(reactor, tps.pool, WSGIHandler())
root = twresource.Root(resource)

и: -

internet.TCPServer(PORT, main_site).setServiceParent(multi)

вместо использования: -

wsgi_root = wsgi_resource()
root = Root(wsgi_root)

и: -

internet.TCPServer(PORT, main_site).setServiceParent(application)

Модифицированный метод также не помог мне избежать проблемы с зависаниями. Есть ли кто-нибудь, кто успешно запускает приложения django в режиме витого демона?.

Я исправлял ошибки при комбинировании этих кодов? В настоящее время я только начал изучать витые архитектуры в деталях.Пожалуйста, помогите мне решить эту проблему

Я ищу файл конфигурации Twisted Application (TAC), который интегрирует приложение django с витой и запускается без проблем в режиме демона.

Спасибо и С уважением,

Харидас Н.

1 Ответ

4 голосов
/ 27 апреля 2011

Я думаю, вы почти у цели.Просто добавьте еще одну строку в самом конце:

multi.setServiceParent(application)
...