Найти - Пользователи
Полная версия: Как завершить функцию?
Начало » Python для новичков » Как завершить функцию?
1
oxdeadbeef
В скрипте выполняются три функции каждая в своём потоке
Две из них бесконечновыполняемые, а третья просто очень долго выполняется
При нажатии CTRL+C выполнение функций не прерывается…
Помогите пожалуйста решить проблему
Пример кода:
import os, sys, threading, time
from threading import Thread
class test1(threading.Thread):
	def __init__(self):
		threading.Thread.__init__(self)
		self.kill_received = False
	def run(self):
		while not self.kill_received:
			self.do_something()
	def do_something(self):
		#avtotest(2, '')
		[i*i for i in range(10000)]
		print(1)
		time.sleep(1)
class test2(threading.Thread):
	def __init__(self):
		threading.Thread.__init__(self)
		self.kill_received = False
	def run(self):
		while not self.kill_received:
			self.do_something()
	def do_something(self):
		[i*i for i in range(10000)]
		print(2)
		time.sleep(1)
class test3(threading.Thread):
	def __init__(self):
		threading.Thread.__init__(self)
		self.kill_received = False
	def run(self):
		while not self.kill_received:
			self.do_something()
	def do_something(self):
		func()
def func():
	for i in xrange(10000):
		print(3)
		time.sleep(1)
			
def main(args):
	
	t1 = test1()
	t2 = test2()
	t3 = test3()
	t1.start()
	t2.start()
	t3.start()
	
	while True:
		try:
			time.sleep(1.0)
		except KeyboardInterrupt:
			print "Ctrl-c received! Sending kill to threads..."
			t1.kill_received = True
			t2.kill_received = True
			t3.kill_received = True
			break
	stop=raw_input('Stop test (y/n) ?: ')
if __name__=="__main__":
	main(sys.argv)
bw
kill_received это странный флаг, чаще берут что-то вроде finishing, terminated и т.д. У `test1` и у `test2` относительно короткий цикл, примерно секунда и они более-менее сразу завершатся, а вот `test3` только по истечении без четверти трёх часов (10'000 сек.).

Как вариант, потокам можно выставлять свойство `daemon`, тогда они будут прерываться вместе с завершение процесса (если ты в потоке не успел дописать файл или ещё чего такого, то ты сам себе злобный буратино).

Вообще шрифт полное говно, но выскажусь хотя бы по одному пункту. Лучше не менять так атрибуты (kill_received = True), сделай метод и вызывай его:
class test1(threading.Thread):
    terminated = False
    def kill(self):
        self.terminated = True
    def run(self):
        while not self.terminated:
            pass

..bw
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB