Как прекратить запускать мои темы после определенного периода времени? - PullRequest
0 голосов
/ 21 ноября 2018

Мне нужно через некоторое время прекратить работу моих потоков. В этом примере я поставил только 120 секунд.Я пытаюсь с помощью этого метода, он не работает.

from threading import Thread
from Queue import Queue
import os
import time

timeout = 120   # [seconds]

timeout_start = time.time()

#while True :


def OpenWSN ():
    os.system("./toto")

def Wireshark():
    os.system(" tshark -i tun0 -T ek -w /home/ptl/PCAP_Brouillon/Sim_Run3rd.pcap > /dev/null ")


def wrapper1(func, queue):
    queue.put(func())

def wrapper2(func, queue):
    queue.put(func())


q = Queue()
Thread(target=wrapper1, args=(OpenWSN, q)).start()
Thread(target=wrapper2, args=(Wireshark,  q)).start()

#print (time.time())
print ("***************** End Simulation *************************")
os.system("quit")

1 Ответ

0 голосов
/ 21 ноября 2018

Я думаю, что это то, что вы пытаетесь достичь:

import threading
from queue import Queue
import os
import time

timeout = 120   # [seconds]

timeout_start = time.time()

def OpenWSN ():
    print( "OpenWSN:")
    os.system("echo -OpenWSN-")

def Wireshark():
    print( "Wireshark:")
    os.system("echo -Wireshark-")

def wrapper1(func, queue):
    queue.put(func())

def wrapper2(func, queue):
    queue.put(func())

q = Queue()
threading.Thread(target=wrapper1, args=(OpenWSN, q)).start()
threading.Thread(target=wrapper2, args=(Wireshark,  q)).start()

cv = threading.Condition()
cv.acquire()
cv.wait( timeout )

print ("***************** End Simulation *************************")
print (" Simulation Time: {0}s".format( time.time() - timeout_start) )

os.system("echo -exit-")

Это приводит к следующему выводу:

C:\temp\StackExchange\StopRunningThread>python -B stop-running-thread.py
OpenWSN:
Wireshark:
-OpenWSN-
-Wireshark-
***************** End Simulation ************************* 
Simulation Time: 120.04460144042969s
-exit-

Что происходит там - вы запускаете два потока, каждыйзапускает отдельный процесс в системе.После того как указанные потоки были запущены, вы возвращаетесь в свой основной поток, выделяете «блокировку» и ждете, пока не будет сигнализирована эта блокировка или истечет время ожидания.В этом конкретном случае никто не сигнализирует о блокировке, поэтому единственный шанс завершить приложение - дождаться истечения времени ожидания.Я хотел бы расширить ваше приложение, чтобы оно сигнализировало о блокировке в каждой функции потока, чтобы мы могли завершить основной поток, только если обе функции потока завершаются.Но это не было частью вашего вопроса, поэтому я предполагаю, что вы можете уйти без сигналов.

...