Bonjour à tous,
Voilà j'ai un programme qui utilise des threads mais mon problème c'est que j'utilise une fonction qui m'empêche de tuer les threads quand je fait un "Ctrl+c".
La fonction en question émule le fonctionnement de la commande système "tail -f".
Voici mon programme :
Quand je fais un "Ctrl+c", je vois bien les print qui me disent que les thread sont tués mais le programme continue de tourner. Le problème vient de la fonction tail_f qui continue de tourner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 #!/usr/bin/python # -*- coding: utf-8 -*- import sys import re import time import threading def tail_f(fh): interval = 1.0 while True: where = fh.tell() line = fh.readline() if not line: time.sleep(interval) fh.seek(where) else: yield line class FileParser(threading.Thread): def __init__(self, file_name): threading.Thread.__init__(self) self.file_name = file_name self.file = open(file_name) self._stopevent = threading.Event( ) def run(self): while not self._stopevent.isSet(): file_name = self.file_name sum_type = "VOP" node_name = "" operation_type = "" operation_counter = "" for line in tail_f(self.file): # TODO: Parse the lines and print the right output for collectd line = line.rstrip("\n") regex="\s%s\sSUMMARY\s\[(\w+)\.\w+\]\s(\w+)\scnt\/(\d+)\s" % sum_type pattern = re.compile(regex) found = pattern.search(line) if found: node_name = found.group(1) operation_type = found.group(2) operation_counter = found.group(3) timestamp = time.time() print "PUTVAL %s.lbdaq.cern.ch/cvfs-%s/operations-%s %d:%s\n" % (node_name, file_name, operation_type, timestamp, operation_counter) self.file.close() self._stopevent.wait(2.0) def stop(self): self._stopevent.set() def main(): files = sys.argv[1:] threads = [] for name in files: thread = FileParser(name) thread.start() threads.append(thread) while True: try: time.sleep(1) except KeyboardInterrupt: print "stoping" for thread in threads: thread.stop() print "thread tue" print "done" sys.exit(0) if __name__ == '__main__': main()
Il faudrait que je puisse arrêter la fonction quand je tue les threads. Est-ce que quelqu'un aurait une idée de comment je pourrai faire ça ?
Merci d'avance.
Partager