Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 饥饿_Python_Multithreading_Race Condition - Fatal编程技术网

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
...
这可能对你有帮助,