Python 饥饿
我尝试运行两个不同的阻塞函数,它们使用相同的全局变量Python 饥饿,python,multithreading,race-condition,Python,Multithreading,Race Condition,我尝试运行两个不同的阻塞函数,它们使用相同的全局变量a 守则: 从concurrent.futures导入ThreadPoolExecutor,完成时 导入线程 输入键盘 a=0 def incA(): 全球a 尽管如此: 打印(f'inca:{a}->{a+1}',end='\n') a+=1 如果按了键盘“.u”(“q”):#如果按了“q”键 打破 def printA(): #a是只读的 尽管如此: print(f'print a:{a}',end='\n') 如果按了键盘“.u”(“q”
a
守则:
从concurrent.futures导入ThreadPoolExecutor,完成时
导入线程
输入键盘
a=0
def incA():
全球a
尽管如此:
打印(f'inca:{a}->{a+1}',end='\n')
a+=1
如果按了键盘“.u”(“q”):#如果按了“q”键
打破
def printA():
#a是只读的
尽管如此:
print(f'print a:{a}',end='\n')
如果按了键盘“.u”(“q”):#如果按了“q”键
打破
使用ThreadPoolExecutor(最大工作线程数=2)作为执行器:
f1=执行人提交(印加)
f2=执行者提交(打印A)
所需输出:
。
.
.
inc a:15640->15641
打印a:15641
inc a:15641->15642
打印a:15642
inc a:15642->15643
打印a:15643
.
.
.
此代码的给定输出如下所示:
打印a:1428inc a:1429->1430
打印a:1429
inc a:1430->1431打印a:1430
inc a:1431->1432打印a:1431
inc a:1432->1433打印a:1432
inc a:1433->1434打印a:1433
inc a:1434->1435打印a:1434
inc a:1435->1436打印a:1435
inc a:1436->1437打印a:1436
这与我想要的很接近,但正如您所看到的,一些打印的结尾(不要与printA
函数混淆)被切断了,即使我在函数中显式地将end='\n'
放入
我试图给系统加一个锁,但结果是饿死了。在每个函数的
while True
循环中,我添加了以下行:
def printA():
全局锁
#a是只读的
尽管如此:
尝试:
lock.acquire()
print(f'print a:{a}',end='\n')
如果按了键盘“.u”(“q”):#如果按了“q”键
打破
最后:
lock.release()
导致此输出(饥饿)的原因:
inca:1319->1320
inc a:1320->1321
inc a:1321->1322
inc a:1322->1323
inc a:1323->1324
inc a:1324->1325
打印a:1325
打印a:1325
打印a:1325
打印a:1325
打印a:1325
打印a:1325
使用Ron Serruya建议的链接,我们在邮件中添加新行以防止分离
修改代码
from concurrent.futures import ThreadPoolExecutor, as_completed
import threading
import keyboard
a = 0
def incA():
global a
while True:
print(f'inc a: {a} -> {a+1}\n', end = '') # Place newline in message to prevent separation
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}\n', end = '') # Place newline in message to prevent separation
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)
输出
...
inc a: 3459 -> 3460
print a: 3459
print a: 3459
inc a: 3460 -> 3461
print a: 3460
inc a: 3461 -> 3462
print a: 3461
inc a: 3462 -> 3463
inc a: 3463 -> 3464
print a: 3463
inc a: 3464 -> 3465
print a: 3464
inc a: 3465 -> 3466
print a: 3465
inc a: 3466 -> 3467
print a: 3466
...
这可能对你有帮助,