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