@armageddon234

Как из класса из функции, перетащить значение в другой класс в функцию?

вот мне дали задание. Я запустил два цикла одновременно и мне нужно dej1 и dej2 перенести во второй класс в функцию, я не знаю как использовать ее, а второй раз функцию вызвать наверное не могу. Как мне из первого класса использовать dej1 и dej2 во встором классе

class search_time(Thread):
	def run(self):
		run_time = True
		while run_time:
			run_search_time_1 = True
			run_search_time_2 = False
			while run_search_time_1:
				date = datetime.datetime.today()
				time_day = str(date.strftime('%H:%M:%S'))
				if time_day == "16:43:00" or time_day == "16:43:01" or time_day == "16:43:02":
					dej1 = random.randint(1, 27)
					dej2 = random.randint(1, 27)
					dej = True
					while dej:
						if dej1 == dej2:
							dej2 = random.randint(1, 27)
						if dej1 != dej2:
							dej = False			
					run_search_time_2 = True		
					run_search_time_1 = False
			while run_search_time_2:
				date = datetime.datetime.today()
				time_day = str(date.strftime('%H:%M:%S'))
				if time_day == "16:44:00":
					run_search_time_1 = True
					run_search_time_2 = False

class runbot(Thread):
	def run(self):
		for event in longpoll.listen():
			if event.type == VkBotEventType.MESSAGE_NEW:
				if event.from_chat:

					id = event.chat_id
					msg = event.object.message['text'].lower()

					if msg == 'кто дежурный':
						vk_session.method('messages.send', {'chat_id' : id, 'message' : 'Дежурные сегодня: ' + student[dej1] + ' и ' + student[dej2], 'random_id' : 0})

w1 = search_time()
w1.start()
w2 = runbot()
w2.start()
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Проще всего вынести переменные из локальных в экземпляр класса. А потом дописать второму классу конструктор, и передавать ссылку на первый класс. Но чтобы избежать состояний гонки (когда два потока лезут в одну переменную, и хотя бы один из них - на запись), нужно спрятать переменные dej1 и dej2 под мьютекс(в терминах питона - Lock).
class search_time(Thread):
  def __init__(self):
    super().__init__()
    self.dej = ""
    self.dej2 = ""
    self.dej_mutex = threading.Lock()
  def run(self):
    #в коде run запись в self.dej1 или self.dej2 делается строго так
    if self.dej_mutex.acquire(): #если Lock уже занят вторым потоком, первый подождёт освобождения
      self.dej1 = "Вася Пупкин"
      self.dej2 = "Жора Золотарёв"
      self.dej_mutex.release() #а теперь сами освободим Lock, чтобы второй поток мог обратиться к переменным

Во втором потоке создаёшь конструктор, и передаёшь ему ссылку на первый поток.
class runbot(Thread):
  def __init__(self, st):
    super().__init__()
    self.st = st
  def run(self):
    #в коде обращение к dej1 или dej2 делается строго так
    if self.st.dej_mutex.acquire(): #если Lock сейчас занят первым потоком, ждём освобождения
      print(self.st.dej1, self.st.dej2) #используем переменные
      self.st.dej_mutex.release() #а теперь сами освободим Lock, чтобы первый поток мог обратиться к переменным


Тогда при создании потоков сделаешь так:
w1 = search_time()
w1.start()
w2 = runbot(w1)
w2.start()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы