尝试 运行 2 个阻塞函数时与 ThreadPoolExecutor 发生死锁
deadlock with ThreadPoolExecutor when trying to run 2 blocking functions
我正在尝试 运行 2 个不同的阻塞函数,它们使用相同的全局变量 a
。
代码:
from concurrent.futures import ThreadPoolExecutor, as_completed
import keyboard
a = 0
def incA():
global a
while True:
print(f'inc a: {a} -> {a+1}')
a+=1
if keyboard.is_pressed('q'): # if key 'q' is pressed
break
def printA():
# a is read-only
while True:
print(f'print a: {a}')
if keyboard.is_pressed('q'): # if key 'q' is pressed
break
with ThreadPoolExecutor(max_workers=2) as executor:
f1 = executor.submit(incA())
f2 = executor.submit(printA())
当我尝试 运行 这段代码时,我得到了 deadlock
。
输出:
inc a: 15640 -> 15641
inc a: 15641 -> 15642
inc a: 15642 -> 15643
inc a: 15643 -> 15644
inc a: 15644 -> 15645
inc a: 15645 -> 15646
inc a: 15646 -> 15647
inc a: 15647 -> 15648
inc a: 15648 -> 15649
inc a: 15649 -> 15650
inc a: 15650 -> 15651
inc a: 15651 -> 15652
inc a: 15652 -> 15653
print a: 15653
如何解决这个问题,使我的代码 运行 异步,使其具有如下所示的输出:
.
.
.
inc a: 15640 -> 15641
print a: 15641
inc a: 15641 -> 15642
print a: 15642
inc a: 15642 -> 15643
print a: 15643
.
.
.
当您调用 submit
时,您在函数中包含 括号:
f1 = executor.submit(incA())
f2 = executor.submit(printA())
因此,您不是传递函数对象,而是执行函数一次并传递结果,除了incA()
从不returns,所以你永远不会真正提交任何东西。
只需删除括号:
f1 = executor.submit(incA)
f2 = executor.submit(printA)
我正在尝试 运行 2 个不同的阻塞函数,它们使用相同的全局变量 a
。
代码:
from concurrent.futures import ThreadPoolExecutor, as_completed
import keyboard
a = 0
def incA():
global a
while True:
print(f'inc a: {a} -> {a+1}')
a+=1
if keyboard.is_pressed('q'): # if key 'q' is pressed
break
def printA():
# a is read-only
while True:
print(f'print a: {a}')
if keyboard.is_pressed('q'): # if key 'q' is pressed
break
with ThreadPoolExecutor(max_workers=2) as executor:
f1 = executor.submit(incA())
f2 = executor.submit(printA())
当我尝试 运行 这段代码时,我得到了 deadlock
。
输出:
inc a: 15640 -> 15641
inc a: 15641 -> 15642
inc a: 15642 -> 15643
inc a: 15643 -> 15644
inc a: 15644 -> 15645
inc a: 15645 -> 15646
inc a: 15646 -> 15647
inc a: 15647 -> 15648
inc a: 15648 -> 15649
inc a: 15649 -> 15650
inc a: 15650 -> 15651
inc a: 15651 -> 15652
inc a: 15652 -> 15653
print a: 15653
如何解决这个问题,使我的代码 运行 异步,使其具有如下所示的输出:
.
.
.
inc a: 15640 -> 15641
print a: 15641
inc a: 15641 -> 15642
print a: 15642
inc a: 15642 -> 15643
print a: 15643
.
.
.
当您调用 submit
时,您在函数中包含 括号:
f1 = executor.submit(incA())
f2 = executor.submit(printA())
因此,您不是传递函数对象,而是执行函数一次并传递结果,除了incA()
从不returns,所以你永远不会真正提交任何东西。
只需删除括号:
f1 = executor.submit(incA)
f2 = executor.submit(printA)