2015-09-16 1 views
0

Сценарий:Разрешение нескольких процессов для подключения к процессу одноплодной и вызывать вызовы методов или доступа к ресурсам

Я в настоящее время есть класс MyLoadBalancerSingleton, который управляет доступом к группе ресурсов (resource1 и resource2). Класс имеет методы и delete (count). Когда эти методы вызывают, балансировщик нагрузки будет помещать в очередь запрос, а затем обрабатывает его FIFO на ресурсах.

Естественно, должен быть только один балансировщик нагрузки, в противном случае каждый из них будет считать, что они имеют полный контроль над ресурсами, которыми управляют.

Вот проблема:

Несколько пользователей одновременно пытаются получить доступ к балансировкам нагрузки с графическим интерфейса. Каждый пользователь будет создавать свой собственный графический интерфейс через python gui.py на том же компьютере. (Они будут все ssh в одну машину). Таким образом, каждый графический интерфейс будет работать в собственном процессе. Затем GUI попытается связаться с балансировщиком нагрузки.

Возможно ли, что эти несколько процессов с графическим интерфейсом доступны только для одного процесса балансировки нагрузки и вызывают методы балансировки нагрузки?

Я заглянул в библиотеку multiprocessing, и кажется, что рабочий процесс противоположный тому, что я хочу. В моем примере это будет: Процесс Loadbalancer запускает 2 процесса GUI (дочерний), а затем разделяет родительские ресурсы с дочерним. В моем примере как графический интерфейс, так и балансировка нагрузки - это процессы верхнего уровня. (Нет отношения родитель-ребенок)

Я подозреваю, что Синглтон не является правильным словом, поскольку одиночные игры работают только в одном процессе. Может быть, запустить балансировку нагрузки как процесс демона, а затем подключить к ним эти процессы графического интерфейса? Я пробовал искать IPC, но это просто привело меня к модулю multiprocessing, который не то, что я хочу. distributed, cluster computing modules (dispy) не то, что я хочу. Это строго обрабатывает связь между собой (IPC?) На одной машине.

Это подводит меня к моему первоначальному вопросу: Возможно ли разрешить нескольким процессам подключаться к одноточечному процессу и вызывать вызовы методов или доступ к его ресурсам? Все процессы будут выполняться на одной машине.

Фиктивные псевдокод:

LoadBalancer.py

class MyLoadBalancerSingleton(object): 
    def __init__(): 
     # Singleton instance logic here 
     # Resource logic here 
    def create(count): 
     resource1.create(count) 
     resource2.create(count) 
    def delete(count): 
     resource1.delete(count) 
     resource2.delete(count) 

Gui.py

class GUI(object): 
    def event_loop(): 
     # count = Ask for user input 
     # process = Locate load balancer process 
     # process.create(count) 
     # process.delete(count) 

Спасибо за ваше время!

ответ

0

Да, это возможно. У меня нет простого примера на Python, но вы можете это сделать. Существует несколько видов IPC, которые позволяют нескольким клиентам (GUI, в вашем случае) подключаться к одному серверу (ваш синглтон, который да, обычно запускается как демон).Вот некоторые из них:

  • Кросс-платформенный: TCP-сокеты. Вам понадобится ваш сервер, чтобы разрешить несколько подключений в одном прослушивающем сокете, и обрабатывать их, когда клиенты подключаются (и отключаются). Самый простой подход к использованию на нескольких компьютерах, но также наименее безопасный вариант (без ACL и т. Д.).
  • Windows-specific: Именованные трубы. Именованные каналы Windows, в отличие от аналогично названной, но гораздо менее функциональной ОС POSIX, позволяют нескольким клиентам одновременно подключаться. Вам нужно будет создать сервер каналов с несколькими экземплярами. У MSDN есть хорошие примеры этого. Я не уверен, что лучший способ сделать это в Python будет, но я знаю, что у ActivePython есть обертки для API с именем pipe. Клиенты должны иметь возможность открывать файл (формы \\.\pipe\LoadBalancer). Файловые API используются для чтения и записи в каналы.
  • POSIX-only (Linux, BSD, OS X и т. Д.): Сокеты домена Unix. POSIX эквивалент названных каналов NT, они используют API сокетов, но конечная точка находится в файловой системе (например, /var/LoadBalanceSocket), а не на IP-адресе/протоколе/кортеже.
  • Другие вещи, например, файлы с общей памятью/памятью, RPC, COM (в Windows), Grand Central Dispatch (OS X), D-Bus (межплатформенная, но сторонняя) и т. Д. , Ни один из них, за исключением GCD, не идеален для простого случая, о котором вы говорите.

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

+0

Отличный ответ. Он предоставил обзор и возможности каждого варианта. Спасибо! – lbrtdy

+0

Нет проблем, и удачи в вашем проекте! Кроме того, добро пожаловать в StackOverflow! Быстрый совет: если вы считаете, что ответ хороший (стоит признать, даже если это не самый лучший ответ), вы можете нажать стрелку вверх рядом с ним, чтобы увеличить его видимость. Обычно я также упоминал галочку «принять этот ответ», но вы уже попали в нее. – CBHacking

 Смежные вопросы

  • Нет связанных вопросов^_^