スレッド間のデータの受け渡し

Java ではなく Python の話です。
Thread生成時の引数にどういう転送用のオブジェクトを渡すか。。。
以下、サンプルです。
Queue を使う
ThA.py

# -*- coding: utf-8 -*-
from threading import Thread
import time
import sys
sys.path.append("../logtool")
from logtool.logger import Logger

class ThreadA(Thread):
    def __init__(self, queue):
        super().__init__()
        self.logger = Logger()
        self._queue = queue
        self._name = 'ThreadA'
    def run(self):
        self.logger.debug('sleep 2')
        time.sleep(2)
        self._queue.put('A')
        self.logger.debug('queue put ')

ThB.py

# -*- coding: utf-8 -*-
from threading import Thread
import sys
sys.path.append("../logtool")
from logtool.logger import Logger

class ThreadB(Thread):
    def __init__(self, queue):
        super().__init__()
        self.logger = Logger()
        self._queue = queue
        self._name = 'ThreadB'
    def run(self):
        self.logger.debug('start')
        val = self._queue.get()
        self.logger.debug('queue get = %s' % val)

ThreadA でセットしたQueue を ThreadB で取得

# -*- coding: utf-8 -*-
import sys
sys.path.append("../logtool")
from logtool.logger import Logger
from queue import Queue
from  ThA import ThreadA
from  ThB import ThreadB

if __name__ == '__main__':
    logger = Logger()
    logger.debug('-- Main START --')
    
    queue = Queue()

    tb = ThreadB(queue)
    ta = ThreadA(queue)

    tb.start()
    ta.start()

    tb.join()
    ta.join()
    logger.debug('-- Main END --')

ThreadB は、Queue の get() で、値が入るまで待ち合わせができます。

List(配列) を使う

# -*- coding: utf-8 -*-
from threading import Thread, Condition
import time
import sys
sys.path.append("../logtool")
from logtool.logger import Logger

class ThreadA(Thread):
    def __init__(self, cv, list):
        super().__init__()
        self.logger = Logger()
        self._cv = cv
        self._list = list
        self._name = 'ThreadA'
    def run(self):
        global cv
        self._list.append('A')
        self.logger.debug('list append')
        with self._cv:
            self._cv.notify()
class ThreadB(Thread):
    def __init__(self, cv, list):
        super().__init__()
        self.logger = Logger()
        self._cv = cv
        self._list = list
        self._name = 'ThreadB'
    def run(self):
        with self._cv:
            self.logger.debug('wait')
            self._cv.wait()
        v = self._list.pop()
        self.logger.debug('list pop %s' % v)

待ち合わせ、同期の為に、threading.Condition を使います。

from threading import Condition
import sys
sys.path.append("../logtool")

if __name__ == '__main__':

    list = []
    cv = Condition()

    tb = ThreadB(cv, list)
    ta = ThreadA(cv, list)

    tb.start()
    ta.start()

    tb.join()
    ta.join()

通知先が複数の場合を考慮すると threading.Condition を併用すべきですが、
シンプルな queue.Queue は、空の場合、get() でブロックしてくれるので魅力です。