Python: как передать весь объект в многопоточной программе? - PullRequest
0 голосов
/ 08 марта 2019

Я запустил параллельную программу с использованием Python.У меня простой вопрос: я использую класс Thread для создания нескольких параллельных процессов.Я хотел бы, чтобы эти потоки передавали объекты друг другу (поэтому я хотел бы, чтобы поток не только замечал определенное событие, но и брал объект из этого события (когда это происходит)!).Как я могу это сделать?Большое спасибо!

Пример кода:

class Process(Thread):
def __init__(self):
    super(Processo, self).__init__()

def run(self):
    myObject = SomeObject(param1, param2, param3)
    # Code to pass myObject to all the threads

    # Code waiting for the object to use it

def main():
   process1 = Process()
   process2 = Process()
   process3 = Process()

   process1.start()
   process2.start()
   process3.start()

1 Ответ

0 голосов
/ 12 марта 2019

Вы можете использовать queue.Queue для связи между потоками.Есть простой пример двух потоков.Одна нить кладет предметы на одну сторону queue, а другая забирает их.queue может также использоваться для многопользовательского многопользовательского приложения (но перед реализацией плана, как оно должно работать).

from queue import Queue
from random import randint
import threading 
import time

class Producer(threading.Thread):
    def __init__(self, queue):
        super(Producer, self).__init__()
        self.queue = queue

    def run(self):
        while True:
            thread_name = self.name

            if not self.queue.full():
                print('Will send "{}"'.format(thread_name))
                self.queue.put(thread_name)

            time.sleep(randint(1, 3))

class Consumer(threading.Thread):
    def __init__(self, queue):
        super(Consumer, self).__init__()
        self.queue = queue

    def run(self):
        while True:
            if not self.queue.empty():
                received = self.queue.get()
                print('Received "{}"'.format(received))

            time.sleep(randint(1, 3))

if __name__ == '__main__':
    q = Queue()

    a = Producer(queue=q)
    b = Consumer(queue=q)

    a.start()
    b.start()

    a.join()
    b.join()

sleeps только для его замедления для демонстрации.Есть документация для Очередь

Примечание: поток не совпадает с процессом.Будьте осторожны с терминологией, которую вы можете неправильно понять.

...