Общение с рабочим демоном Python

Это работает для меня

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    public static class AsyncHelper
    {
        private static readonly TaskFactory _myTaskFactory = new TaskFactory(CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default);

        public static void RunSync(Func<Task> func)
        {
            _myTaskFactory.StartNew(func).Unwrap().GetAwaiter().GetResult();
        }

        public static TResult RunSync<TResult>(Func<Task<TResult>> func)
        {
            return _myTaskFactory.StartNew(func).Unwrap().GetAwaiter().GetResult();
        }
    }

    class SomeClass
    {
        public async Task<object> LoginAsync(object loginInfo)
        {
            return await Task.FromResult(0);
        }
        public object Login(object loginInfo)
        {
            return AsyncHelper.RunSync(() => LoginAsync(loginInfo));
            //return this.LoginAsync(loginInfo).Result.Content;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var someClass = new SomeClass();

            Console.WriteLine(someClass.Login(1));
            Console.ReadLine();
        }
    }
}
52
задан hanksims 18 March 2009 в 15:14
поделиться

7 ответов

Что относительно того, чтобы выполнить его http сервер?

Это кажется сумасшедшим, но рабочий простой веб-сервер для управления Вашим сервером требует всего нескольких строк с помощью web.py

, можно также рассмотреть создание канала Unix.

18
ответ дан Ali Afshar 7 November 2019 в 19:22
поделиться

Еще один подход: используйте Пиротехническое средство (объекты ремоутинга Python).

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

По умолчанию, демон сервера Пиротехнического средства принимает соединения отовсюду. Для ограничения этого, любое использование блок проверки допустимости соединения (см. документацию), или предоставляют host='127.0.0.1' к Daemon конструктор, чтобы только прислушаться к локальным соединениям.

Пример кода, взятый из документации Пиротехнического средства:

Сервер

import Pyro.core

class JokeGen(Pyro.core.ObjBase):
        def __init__(self):
                Pyro.core.ObjBase.__init__(self)
        def joke(self, name):
                return "Sorry "+name+", I don't know any jokes."

Pyro.core.initServer()
daemon=Pyro.core.Daemon()
uri=daemon.connect(JokeGen(),"jokegen")

print "The daemon runs on port:",daemon.port
print "The object's uri is:",uri

daemon.requestLoop()

Клиент

import Pyro.core

# you have to change the URI below to match your own host/port.
jokes = Pyro.core.getProxyForURI("PYROLOC://localhost:7766/jokegen")

print jokes.joke("Irmen")

Другой подобный проект RPyC. Я не попробовал RPyC.

35
ответ дан Mark Mikofski 7 November 2019 в 19:22
поделиться

Я использовал бы скрученный с именованным каналом или просто открыл бы сокет. Смотрите на сервер эха и клиент примеры . Необходимо было бы изменить сервер эха, чтобы проверить на некоторую строку, переданную клиентом и затем ответить безотносительно требуемой информации

из-за проблем поточной обработки Python, которые Вы собираетесь испытать затруднения при ответе на информационные запросы, одновременно продолжая делать независимо от того, что демон предназначен, чтобы сделать так или иначе. Асинхронные методы или разветвляющий другого обрабатывают, Ваша единственная реальная опция.

9
ответ дан MrEvil 7 November 2019 в 19:22
поделиться

Используйте werkzeug и заставьте своего демона включать основанный на HTTP сервер WSGI.

у Вашего демона есть набор маленьких приложений WSGI для отвечания информацией о статусе.

Ваш клиент просто использует urllib2, чтобы сделать POST или ПОЛУЧИТЬ запросы к localhost:somePort. Ваш клиент и сервер должен договориться о номере порта (и URL).

Это очень просто реализовать и очень масштабируемый. Добавление новых команд является тривиальным осуществлением.

Примечание, что Ваш демон не должен отвечать в HTML (это часто просто, хотя). Наши демоны отвечают на WSGI-запросы с JSON-закодированными объектами состояния.

16
ответ дан bstpierre 7 November 2019 в 19:22
поделиться
# your server

from twisted.web import xmlrpc, server
from twisted.internet import reactor

class MyServer(xmlrpc.XMLRPC):

    def xmlrpc_monitor(self, params):        
        return server_related_info

if __name__ == '__main__':
    r = MyServer()
    reactor.listenTCP(8080, Server.Site(r))
    reactor.run()

клиент может быть записан с помощью xmlrpclib, проверить пример кода здесь .

7
ответ дан Badri 7 November 2019 в 19:22
поделиться

Вы могли связать его с Пиротехническим средством ( http://pythonhosted.org/Pyro4/ ) Удаленный объект Python. Это позволяет Вам удаленно объекты Python доступа. Это должно легко реализовать, имеет низко наверху, и не так агрессивно как Скрученное.

4
ответ дан Maori 7 November 2019 в 19:22
поделиться

Принятие Вас находится под *, отклоняют, можно отправить сигналы в под управлением программу с kill от оболочки (и аналоги во многих других средах). Для обработки их из Python проверяют модуль сигнала .

5
ответ дан MarkusQ 7 November 2019 в 19:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: