通过使用绑定到其他对象的回调与线程通信是否可以?

时间:2019-02-28 20:00:48

标签: python multithreading thread-safety

我想使用回调而不是队列来与线程通信。在下面的代码中,MainThread考虑Service线程报告的时间量,并根据该值决定保留还是抛出。

可以在Python中执行此操作吗?此模式的名称是什么?关于线程安全性的任何建议吗?

class Service(threading.Thread):

    def __init__(self, cb_obj):

        threading.Thread.__init__(self)

        self.cb_obj = cb_obj

    def run(self):

        start = time.time()

        time.sleep(1)

        stop = time.time()

        self.cb_obj.cb(stop - start)


class MainThread(threading.Thread):

    def __init__(self):

        threading.Thread.__init__(self)

    def run(self):

        service = Service(self)

        service.start()

    def cb(self, time_to_completion):

        if time_to_completion < 2:

            print('keep')

        else:

            print('throw')


main = MainThread()

main.start()

1 个答案:

答案 0 :(得分:0)

  

可以在Python中执行此操作吗?

这实际上取决于类方法的作用,但我认为不是。

  

此模式的名称是什么?

这是composition OOP编程的示例。我想。

  

关于线程安全性的任何建议吗?

在此示例中,这是线程安全性,但是...这只是一个简单的示例。

考虑情况。您需要在主线程中使用2个Service类线程。可能您需要在run方法中使用while循环,一个Service类将做更多的事情,例如处理文件。使用CPU(while循环)锁定怎么办?

我认为最佳答案取决于情况使用适当的工具。

关于线程here的不错的文章。

您可以在super()方法中使用__init__进行继承。