Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.09.2020, 18:10
Новичок на форуме
Отправить личное сообщение для jCtapuk Посмотреть профиль Найти все сообщения от jCtapuk
 
Регистрация: 13.09.2020
Сообщений: 2

Как вам Thread?
Мне потребовалось многопоточный цикл. И кажется нашел решение и он прекрасно работает.

Терь можно создать много цикл с разным интервалом.
Но хотел услышать от людей =)

Класс Thread (Сырое конечно)
abstract class Thread {
  private running: boolean = false;

  static sleep(time: number = 1000) {
    return new Promise((resolve) => {
      setTimeout(resolve, time);
    });
  }

  start() {
    if (this.running) return;
    this.running = true
    this.run()
  }

  stop() {
    this.running = false
  }

  get isRunning() {
    return this.running;
  }

  abstract async run(): Promise<void>;
}


Пример рабочий код:
class Game extends Thread {
  async run() {
    while (this.isRunning) {
      console.log('Game Update')
      await Thread.sleep(1000) // 1 sec
    }
  }
}

class Test extends Thread {
  async run() {
    while (this.isRunning) {
      console.log('Test Update')
      await Thread.sleep(5000) // 5 sec
    }
  }
}

new Game().start()
new Test().start()
console.log('run')
Ответить с цитированием
  #2 (permalink)  
Старый 13.09.2020, 21:47
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,701

Почему "многопоточный"?
Все работает в одном потоке.
И представьте, что там не console.log, а действительно тяжелая работа, которая занимает больше, чем время указанное в Thread.sleep
Ответить с цитированием
  #3 (permalink)  
Старый 13.09.2020, 21:58
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

voraa, нода в multithreading не научилась?
Ответить с цитированием
  #4 (permalink)  
Старый 13.09.2020, 22:20
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,701

И что это дает
Ну допустим в run будет запускаться Worker.
По идее по смыслу
new Game().start()
должен запускать новый Worker каждую секунду
Напишем так

new Game().start()
let n = 2**40
while (n--) {
let l = 2**40
while (l--);
};

Через сколько запустится второй Worker?
Даже если тело цикла выполняется в отдельном потоке, сам цикл то работает в одном потоке.

По сути это обертка над setInterval. Делает тоже самое, только более многословно.
Я ничуть не против, если кому то нравится использовать классы везде.
Но зачем называть это многопоточным?

Последний раз редактировалось voraa, 13.09.2020 в 22:36.
Ответить с цитированием
  #5 (permalink)  
Старый 14.09.2020, 20:59
Новичок на форуме
Отправить личное сообщение для jCtapuk Посмотреть профиль Найти все сообщения от jCtapuk
 
Регистрация: 13.09.2020
Сообщений: 2

Ну если не нравится класс то замена функция

function sleep(time = 1000) {
  return new Promise((resolve) => {
    setTimeout(resolve, time);
  });
}

function createThread(run: (isRunning: () => boolean, sleep?: (time: number) => Promise<unknown>) => Promise<unknown>) {
  let running = false

  const stop = () => {
    running = false
  }

  const start = () => {
    if (running) return;
    running = true
    run(() => running, sleep)
  }

  return { start, stop }
}
Ответить с цитированием
  #6 (permalink)  
Старый 14.09.2020, 21:47
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

jCtapuk,
А зачем это надо? Есть же setInterval. Асинхронный код это не многопоточность. К нему относится, помимо Promise (async/await), и setTimeout, и setInterval, поэтому нет разницы.
Ответить с цитированием
  #7 (permalink)  
Старый 15.09.2020, 17:04
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,701

По сути даже это не очень верно.
После вызова stop мгновенной остановки не произойдет. Все равно после этого выполнится последний заданный timeout.
clearInterval прервет выполнение сразу.

Последний раз редактировалось voraa, 15.09.2020 в 17:11.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вам открытие олимпиады ? DjDiablo Оффтопик 33 28.02.2014 22:52
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
http://gigalit.info - Мои контакты Маэстро Ваши сайты и скрипты 70 08.12.2011 03:12
Как сделать как в JQ? faforty Общие вопросы Javascript 8 14.11.2011 01:35