Asynchronous 在tornado中,threadpoolexecutor线程安全吗?

Asynchronous 在tornado中,threadpoolexecutor线程安全吗?,asynchronous,tornado,Asynchronous,Tornado,在tornado中,我们可以使用ThreadPoolExecutor异步执行调用,但ThreadPoolExecutor或@run_on_executor是线程安全的? 如果答案是否定的,如何解决资源共享问题 ThreadPoolExecutor线程安全吗 ThreadPoolExecutor是安全的,只要代码是安全的。它所做的只是在多个线程中运行代码。最终,让代码线程安全完全取决于您 如何解决资源共享问题 通过不共享资源。无论何时,只要您需要对资源执行任何操作,都可以调用主线程并在那里执行

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

ThreadPoolExecutor
线程安全吗

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


如何解决资源共享问题

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

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


例如:

x=1
def print_x():
全球x
如果x==1:
打印x
x+=1
如您所见,上面的代码不是线程安全的,因为每个线程都可以修改
x

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

x=1
def print_x():
#仅在主线程中运行,以确保线程安全
全球x
如果x==1:
打印x
x+=1
def调用_print_x():
#这可以在任何线程中运行
#它要求主线程运行“print_x”`
loop=ioloop.ioloop.current()
loop.add_callback(print_x)#将控件提交到主线程
ThreadPoolExecutor
线程安全吗

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


如何解决资源共享问题

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

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


例如:

x=1
def print_x():
全球x
如果x==1:
打印x
x+=1
如您所见,上面的代码不是线程安全的,因为每个线程都可以修改
x

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

x=1
def print_x():
#仅在主线程中运行,以确保线程安全
全球x
如果x==1:
打印x
x+=1
def调用_print_x():
#这可以在任何线程中运行
#它要求主线程运行“print_x”`
loop=ioloop.ioloop.current()
loop.add_callback(print_x)#将控件提交到主线程

如果loop.add\u回调使响应变慢?@shaidiren否。线程之间的切换非常快。我的意思是,我认为一微秒的延迟并不重要,是吗?如果loop.add_回调使响应变慢了?@shaidiren No。线程之间的切换相当快。我是说,我认为一微秒的延迟都不重要,是吗?