【问题标题】:How to pass an entire object in a multitraded program如何在多线程程序中传递整个对象
【发布时间】:2019-03-08 13:16:01
【问题描述】:

我使用 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()

【问题讨论】:

  • 请提供一些代码,然后我可以帮助您。
  • 代码添加到答案中......
  • 添加global myObject,您的所有Thread 都可以访问此对象。如果并发read/write 可能是这种情况,您必须使用lock-objects。顺便说一句,Thread不是Process,请阅读Multiprocessing vs Threading Python
  • 使用queue.QueueQueue docs

标签: python multithreading events python-multithreading


【解决方案1】:

您可以使用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 只是为了减慢它的速度以进行演示。有Queue的文档

注意:线程与进程不同。小心使用可能被误解的术语。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    相关资源
    最近更新 更多