我正在尝试开始使用Python中的多线程。我有多个线程获取锁,执行操作,释放锁,并将结果输出到csv文件。如果主线程结束,则应终止线程(例如,通过按Ctrl+C)。这是怎么做到的?你知道吗
我认为创建线程守护进程应该可以完成这项工作,因为“当只剩下守护进程线程时,整个Python程序就会退出”(官方Python文档)。这是不够的。根据python: how to terminate a thread when main program ends,我尝试捕捉键盘中断,然后手动终止线程。此外,这是不工作的,似乎是键盘中断捕捉不正确。你知道吗
这让我想到,Python中的多线程有些地方我误解了。。。查找附件我的代码:
import random
import csv
import sys
from datetime import datetime
import threading
lock = threading.Lock()
def observer(obs):
print("In " + str(obs))
sys.stdout.flush()
with open("data/test_" + str(obs) + ".csv", 'a', newline='') as csvfile:
while True:
datenow = datetime.today()
lock.acquire()
print(str(obs) + "acquired")
sum = 0
for i in range(10000):
sum = sum + random.random()
print(str(obs) + "released")
sys.stdout.flush()
lock.release()
writer = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_ALL)
writer.writerow([datenow.isoformat(), sum/10000])
#print(str(obs) + ": " + datenow.isoformat() + " " + str(sum/1000))
sys.stdout.flush()
if __name__ == "__main__":
observe = [1, 2, 3, 4]
processes = []
for obs in observe:
process = threading.Thread(target=observer, args=(obs,), daemon=True)
processes.append(process)
print("Start processes")
for p in processes:
p.start()
print("Started")
try:
for p in processes:
p.join()
except KeyboardInterrupt:
for p in processes:
p.terminate()
print("Keyboard interrupt")
print("Finished")
谢谢!你知道吗
这是错误的
您的线程永远不会退出
while True:
循环,因此您将永远加入它们。但这不是重点。你知道吗如果
Ctrl-C
(又名KeyboardInterrupt
)没有被抓住,我的最佳选择是:Ctrl-C
,因为您的程序正在突然终止。你知道吗你的问题是:
如果上面的假设是正确的,请尝试以下代码(从Python - Windows - Exiting Child Process when "unrelated" parent dies/crashes)
相关问题 更多 >
编程相关推荐