Найти - Пользователи
Полная версия: Особая уличная многопоточность
Начало » Python для новичков » Особая уличная многопоточность
1 2
4kpt_IV
ZZZ
Очереди, это правильно. Посмотри на RabbitMQ.

Или beanstakd…
Metallikus
py.user.next
у каждого клиента должна быть своя очередь
Что-то типа такого?
 #!/usr/bin/python3
import datetime
from threading import Thread
from queue import Queue
class my_little_sheduller(Thread):
    
    def __init__(self, *args, **kwargs):
        Thread.__init__(self, *args, **kwargs)
        self.little_queue = Queue()
        self.workers = []
        
    def run(self):
        while True:
            for worker in self.workers:
                if int(datetime.datetime.now().timestamp()) - worker.last_req < 10:
                    continue #текущий воркер пусть подождёт немного, пропускаем
                print("Помещаю задание в очередь")
                #беру задание из основной очереди и помещаю в очередь воркера, раз мы его не пропустили
                worker.little_queue.put(self.little_queue.get())
                #Изменяю запись о времени последнего запроса в нём
                worker.last_req = int(datetime.datetime.now().timestamp())
            
            
class my_little_worker(Thread):
    
    def __init__(self, name, *args, **kwargs):
        Thread.__init__(self, *args, **kwargs)
        self.name = name
        self.little_queue = Queue()
        self.last_req = 0
        
    def run(self):
        while True:
            if self.little_queue.not_empty:
                #И тут типа запрос к серверу
                print(self.name + " " + self.little_queue.get())
            
little_sheduller = my_little_sheduller()
for i in range(5):
    little_sheduller.workers.append(my_little_worker("cool worker" + str(i)))
for worker in little_sheduller.workers:
    worker.start()
#заполняю основную очередь заданиями
for i in range(100500):
    little_sheduller.little_queue.put("msg " + str(i))
    
little_sheduller.start()
А от чего всю эту прелесть наследовать лучше?

Мысль, что на гринлетах, gevent или ещё чём-то таком можно практически бесплатно 100500 микропотоков сделать, не даёт мне покоя.
py.user.next
Metallikus
Что-то типа такого?
Это полная хрень, но направление верное. Очередь надо создать снаружи и передать её как в распределитель, так и в клиент. То есть должна быть одна очередь между распределителем и клиентом, в которую распределитель пишет с интервалом, а клиент читает постоянно. При этом, если клиент может получать какие-то новые данные, которые требуют новых действий от него, то должна быть вторая очередь в обратную сторону - от клиента к распределителю. Если у тебя клиентов несколько, то обратную очередь можно сделать одну для всех, но сделать возможность определения источника каждого сообщения в очереди.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB