Это работает для меня
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();
}
}
}
Что относительно того, чтобы выполнить его http сервер?
Это кажется сумасшедшим, но рабочий простой веб-сервер для управления Вашим сервером требует всего нескольких строк с помощью web.py
, можно также рассмотреть создание канала Unix.
Еще один подход: используйте Пиротехническое средство (объекты ремоутинга 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.
Я использовал бы скрученный с именованным каналом или просто открыл бы сокет. Смотрите на сервер эха и клиент примеры . Необходимо было бы изменить сервер эха, чтобы проверить на некоторую строку, переданную клиентом и затем ответить безотносительно требуемой информации
из-за проблем поточной обработки Python, которые Вы собираетесь испытать затруднения при ответе на информационные запросы, одновременно продолжая делать независимо от того, что демон предназначен, чтобы сделать так или иначе. Асинхронные методы или разветвляющий другого обрабатывают, Ваша единственная реальная опция.
Используйте werkzeug и заставьте своего демона включать основанный на HTTP сервер WSGI.
у Вашего демона есть набор маленьких приложений WSGI для отвечания информацией о статусе.
Ваш клиент просто использует urllib2, чтобы сделать POST или ПОЛУЧИТЬ запросы к localhost:somePort. Ваш клиент и сервер должен договориться о номере порта (и URL).
Это очень просто реализовать и очень масштабируемый. Добавление новых команд является тривиальным осуществлением.
Примечание, что Ваш демон не должен отвечать в HTML (это часто просто, хотя). Наши демоны отвечают на WSGI-запросы с JSON-закодированными объектами состояния.
# 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, проверить пример кода здесь .
Вы могли связать его с Пиротехническим средством ( http://pythonhosted.org/Pyro4/ ) Удаленный объект Python. Это позволяет Вам удаленно объекты Python доступа. Это должно легко реализовать, имеет низко наверху, и не так агрессивно как Скрученное.
Принятие Вас находится под *, отклоняют, можно отправить сигналы в под управлением программу с kill
от оболочки (и аналоги во многих других средах). Для обработки их из Python проверяют модуль сигнала .