在龙卷风中,threadpoolexecutor是线程安全的吗?

时间:2017-11-14 07:26:06

标签: asynchronous tornado

在龙卷风中,我们可以使用ThreadPoolExecutor异步执行调用,但ThreadPoolExecutor或@run_on_executor是线程安全的吗?   如果答案是'不',如何解决资源共享问题?

1 个答案:

答案 0 :(得分:0)

  

ThreadPoolExecutor线程是否安全?

只要您的代码安全,

ThreadPoolExecutor就是安全的。它所做的只是在多个线程中运行您的代码。最终,完全取决于您的代码是否是线程安全的。

  

如何解决资源共享问题?

不共享资源。任何时候您需要对资源执行任何操作,您可以调用主线程并在那里执行。

在Tornado中,您可以使用ioloop.IOLoop.add_callback将控制权提交回主线程。因此,您可以在ThreadPoolExecutor中运行代码,但只要您想对资源执行任何操作,就可以将控制权提交回主线程。

示例:

x = 1

def print_x():
    global x

    if x == 1:
        print x
        x += 1

如您所见,上面的代码不是线程安全的,因为每个线程都可以修改x

要以线程安全的方式运行它,您必须执行条件检查并修改主线程中的x。也就是说,您只需要在主线程中运行print_x函数,如下所示:

x = 1

def print_x():
    # run it only in the main thread for thread-safety
    global x

    if x == 1:
        print x
        x += 1

def call_print_x():
    # this can be run in any thread
    # it asks the main thread to run `print_x`

    loop = ioloop.IOLoop.current()
    loop.add_callback(print_x) # submit control to main thread