Уведомления

Группа в Telegram: @pythonsu

#1 Июль 27, 2013 20:37:19

oxdeadbeef
Зарегистрирован: 2013-07-27
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Как завершить функцию?

В скрипте выполняются три функции каждая в своём потоке
Две из них бесконечновыполняемые, а третья просто очень долго выполняется
При нажатии 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)

Офлайн

#2 Авг. 2, 2013 09:01:45

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Как завершить функцию?

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



Отредактировано bw (Авг. 2, 2013 09:02:09)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version