Как вызвать две функции одновременно
Перейти к содержимому

Как вызвать две функции одновременно

  • автор:

Как запустить две и более функции одновременно?

Как мне запустить два бота одновременно и чтобы они работали параллельно друг-другу?

  • Вопрос задан более трёх лет назад
  • 1991 просмотр

5 комментариев

Простой 5 комментариев

alternativshik @alternativshik
в 2х разных окнах, на 2 разных компах, в 1 файле вписать запуск двух run().
Yevgeni @Yevgeni Автор вопроса
Yevgeni @Yevgeni Автор вопроса
Yevgeni, мне нужно запустить все в одном файле
Yevgeni @Yevgeni Автор вопроса
Yevgeni, т.е в разных потоках

gordon_shamway

Шамуэй @gordon_shamway
Решения вопроса 1
Сергей Горностаев @sergey-gornostaev Куратор тега Python
Седой и строгий
В отдельных сопрограммах, в отдельных потоках или в отдельных процессах.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ответы на вопрос 2

DarkMode

Made out of meat.
можно и через asyncio
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

Survtur

from threading import Thread thread1 = Thread(target=bot1.run) thread1.start() thread2 = Thread(target=bot2.run) thread2.start()

Но как сказали выше, это только один из возможных путей. Просто он первый пришёл мне в голову.

Как запустить две функции одновременно?

Я сделал через wxPython трей, прописал функцию «on_start» с циклом While isWorking = 1 и по идее функция «on_stop» должна
менять значение isWorking на 0, но функция ,открывающая трей, не работает т.к выполняется другая. Это можно реализовать?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
import keyboard as kb import soundfile as sf import soundcard as sc import wx import wx.adv TRAY_TOOLTIP = 'Voice keyboard' TRAY_ICON = 'icon.png' KeyBind = 'F9' def create_menu_item(menu, label, func): item = wx.MenuItem(menu, -1, label) menu.Bind(wx.EVT_MENU, func, id=item.GetId()) menu.Append(item) return item class TaskBarIcon(wx.adv.TaskBarIcon): def __init__(self, frame): wx.adv.TaskBarIcon.__init__(self) self.myapp_frame = frame self.set_icon(TRAY_ICON) self.Bind(wx.adv.EVT_TASKBAR_LEFT_DOWN, self.on_left_down) def CreatePopupMenu(self): menu = wx.Menu() create_menu_item(menu, 'Say Hello', self.on_hello) menu.AppendSeparator() create_menu_item(menu, 'Exit', self.on_exit) create_menu_item(menu, 'Start ('+KeyBind+')', self.on_start) return menu def set_icon(self, path): icon = wx.Icon(wx.Bitmap(path)) self.SetIcon(icon, TRAY_TOOLTIP) def on_left_down(self, event): print('Tray icon was left-clicked.') def on_hello(self, event): print('Hello, world!') def on_exit(self, event): self.myapp_frame.Close() def on_start(self, event): while True: if kb.is_pressed('f'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_A.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed(','): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_B.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('d'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_V.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('u'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_G.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('l'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_D.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('t'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_E.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('`'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_EO.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed(';'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_J.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('p'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_Z.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('b'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_I.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('q'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_IO.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('r'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_K.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('y'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_N.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('p'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_Z.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('b'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_I.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('q'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_IO.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('r'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_K.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('k'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_L.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('v'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_M.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('y'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_N.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('j'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_O.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('g'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_P.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('h'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_R.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('c'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_S.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('n'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_T.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('e'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_U.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('a'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_F.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('s'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_H.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('w'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_TS.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('x'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_CH.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('i'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_sh.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('o'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_SHZ.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed(']'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_TverdiyZnak.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('s'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_II.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('m'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_MagkiyZnak.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('['): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_H.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('"'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_EIO.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('z'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_IA.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('.'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_IU.wav') default_speaker.play(samples, samplerate=samplerate) class My_Application(wx.Frame): # ---------------------------------------------------------------------- def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, "", size=(1, 1)) panel = wx.Panel(self) self.myapp = TaskBarIcon(self) self.Bind(wx.EVT_CLOSE, self.onClose) # ---------------------------------------------------------------------- def onClose(self, evt): """ Destroy the taskbar icon and the frame """ self.myapp.RemoveIcon() self.myapp.Destroy() self.Destroy() if __name__ == "__main__": MyApp = wx.App() My_Application() MyApp.MainLoop()

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как запустить сервер и бот в Pycharm одновременно
Здравствуйте. Изучаю Django. Столкнулся с проблемой. У меня в одном проекте и сайт, и бот. Сайт.

Как запустить две подпрограммы одновременно
Помогите пожалуйста. Написал не большую программку типа игра как запустить две подпрограммы.

Как запустить две формы одновременно
Здравтсвуйте, у меня есть две формы, первая запускается автоматически, вторая запускается при.

Как выполнить две функции одновременно на Ява?
Сильно ошибся с разделом форума. Приношу свои извинения. Просто рабочий день уже кончается и я.

702 / 348 / 104
Регистрация: 09.02.2018
Сообщений: 789
Пора мне покупать очки. В упор не вижу функции on_stop.
Регистрация: 17.03.2021
Сообщений: 8

Упс, старая версия кода. Секундочку.

Добавлено через 4 минуты

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
import keyboard as kb import soundfile as sf import soundcard as sc import wx import wx.adv isWorking = 0 TRAY_TOOLTIP = 'Voice keyboard' TRAY_ICON = 'icon.png' KeyBind = 'F9' StopKeyBind = 'F10' def create_menu_item(menu, label, func): item = wx.MenuItem(menu, -1, label) menu.Bind(wx.EVT_MENU, func, id=item.GetId()) menu.Append(item) return item class TaskBarIcon(wx.adv.TaskBarIcon): def __init__(self, frame): wx.adv.TaskBarIcon.__init__(self) self.myapp_frame = frame self.set_icon(TRAY_ICON) self.Bind(wx.adv.EVT_TASKBAR_LEFT_DOWN, self.on_left_down) def CreatePopupMenu(self): menu = wx.Menu() create_menu_item(menu, 'Say Hello', self.on_hello) menu.AppendSeparator() create_menu_item(menu, 'Exit', self.on_exit) create_menu_item(menu, 'Start ('+KeyBind+')', self.on_start) create_menu_item(menu, 'Stop ('+StopKeyBind+')', self.on_stop) return menu def set_icon(self, path): icon = wx.Icon(wx.Bitmap(path)) self.SetIcon(icon, TRAY_TOOLTIP) def on_left_down(self, event): print('Tray icon was left-clicked.') def on_hello(self, event): print('Hello, world!') def on_exit(self, event): self.myapp_frame.Close() def on_start(self, event): isWorking = 1 while isWorking = 1: if kb.is_pressed('f'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_A.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed(','): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_B.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('d'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_V.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('u'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_G.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('l'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_D.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('t'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_E.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('`'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_EO.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed(';'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_J.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('p'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_Z.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('b'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_I.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('q'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_IO.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('r'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_K.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('y'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_N.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('p'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_Z.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('b'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_I.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('q'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_IO.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('r'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_K.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('k'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_L.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('v'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_M.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('y'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_N.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('j'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_O.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('g'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_P.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('h'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_R.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('c'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_S.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('n'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_T.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('e'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_U.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('a'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_F.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('s'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_H.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('w'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_TS.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('x'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_CH.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('i'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_sh.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('o'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_SHZ.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed(']'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_TverdiyZnak.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('s'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_II.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('m'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_MagkiyZnak.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('['): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_H.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('"'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_EIO.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('z'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_IA.wav') default_speaker.play(samples, samplerate=samplerate) elif kb.is_pressed('.'): default_speaker = sc.default_speaker() samples, samplerate = sf.read('Sounds\Agressive_IU.wav') default_speaker.play(samples, samplerate=samplerate) def on_stop(self, event): isWorking = 0 class My_Application(wx.Frame): # ---------------------------------------------------------------------- def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, "", size=(1, 1)) panel = wx.Panel(self) self.myapp = TaskBarIcon(self) self.Bind(wx.EVT_CLOSE, self.onClose) # ---------------------------------------------------------------------- def onClose(self, evt): """ Destroy the taskbar icon and the frame """ self.myapp.RemoveIcon() self.myapp.Destroy() self.Destroy() if __name__ == "__main__": MyApp = wx.App() My_Application() MyApp.MainLoop()

Как вызвать две функции одновременно

как сделать что бы выполнялись две функции одновременно?
Если вызвать fun1() потом fun2() то и выполнятся они будут по очереди,
нужно чтобы они одновременно работали, что прочитать, может есть компоненты специальные для этого в builde?

Сообщ. #2 , 17.06.09, 06:17
Full Member
Рейтинг (т): 13

Если есть какой-то цикл — вызываешь внутри Application->ProcessMessages()

Не совсем параллельно, но можно добиться определённым образом, чтобы работало обе, просто при вызове Application->ProcessMessages() — будет передаваться управление, следующей, а запустить их надо или разными кнопками или таймером.

и вариант2, класический:

Используй поток. только не забывай про ограничения по работе с VCL из потоков, тут будут работать железно — параллельно, только если опять же циклы с простоями, не помешает лишний раз сделать Sleep(), хотя и не обязательно, просто во время простоя, не пускать пустые циклы, а делать Sleep;

Сообщ. #3 , 17.06.09, 06:33
Full Member
Рейтинг (т): 1

Сейчас попробую. По второму варианту, сколько максимум потоков можно одновременно запустить, или зависит от производительности компа?

Сообщ. #4 , 17.06.09, 07:35

Цитата brother79 @ 17.06.09, 06:17

Используй поток. только не забывай про ограничения по работе с VCL из потоков, тут будут работать железно — параллельно,

«Железно» паралельная работа возможна только на мультипроцессорных материнках или мультиядерных процессорах. Все остальное (потоки в т.ч.) — эмуляция паралельности.

Сообщ. #5 , 17.06.09, 09:54

Senior Member
Рейтинг (т): 33
Цитата brother79 @ 17.06.09, 06:17

Если есть какой-то цикл — вызываешь внутри Application->ProcessMessages()

Абсолютно неверный вариант, — работать как описано не будет. Application->ProcessMessages() вызывает обработку сообщений но не выходит из вызвавшей функции

Сообщ. #6 , 17.06.09, 10:02
Full Member
Рейтинг (т): 13
Цитата sergey_sv @ 17.06.09, 06:33

Сейчас попробую. По второму варианту, сколько максимум потоков можно одновременно запустить, или зависит от производительности компа?

Да хоть сколько, на сколько памяти хватит, а она виртуальныя, я не помню есть ли там какое-то ограничение или нет на какиень-дь хэндлы. Там ещё можно им приоритеты выставлять, регулировать тем самым загруженность, если процессы сильно будут на себя время проца хавать. Или приоритетами или слипы ставить можно для регулирования, чтобы он отдыхал и давал другому поработать.

Цитата Chow @ 17.06.09, 07:35

«Железно» паралельная работа возможна только на мультипроцессорных материнках или мультиядерных процессорах. Все остальное (потоки в т.ч.) — эмуляция паралельности.

А тут знаешь как-то побарабану параллельно они работают или нет на уровне процессоров. Ещё не факт что на мультипроцессорных будут параллельно работать, кто сказал, что будет столько процов свободно от других задачь, сколько потоков работают.

Сообщ. #7 , 17.06.09, 10:30
Рейтинг (т): 50
Цитата Chow @ 17.06.09, 07:35
мультиядерных процессорах

Кстати, если у меня 2ух-ядерный процессор, то система сама разнесёт потоки по ядрам, или все потоки будут открываться на одном ядре?

Сообщ. #8 , 17.06.09, 10:43
Разнесет, если для процесса не установлена affinity.
Сообщ. #9 , 17.06.09, 10:59
Full Member
Рейтинг (т): 13
Цитата Алексей_Л @ 17.06.09, 10:30

Кстати, если у меня 2ух-ядерный процессор, то система сама разнесёт потоки по ядрам, или все потоки будут открываться на одном ядре?

Если даже у тебя выполняется 1 поток — система может разнести его по ядрам, правда ускорение будет не в 2 раза, а где-то не более 30%, т.к. не все комманды можно по разным процам раскидывать, но механизма такая есть. По 2-м — тоже самое, только не забывай, что там не только твои 2 процесса работают, а их дохрена может быть, не факт, что винда ими не займёт процы. Ведь по сути процов 2, а процессов много, у каждого свои тики, винда и распределяет между ними процессорное время, и не известно про 2 каких-то конкретных процесса, пойдут они на разные проци или будут на 1-м ютиться, т.к. на другом будут другие процессы работать.

Сообщ. #10 , 17.06.09, 11:26

Цитата brother79 @ 17.06.09, 10:02

А тут знаешь как-то побарабану параллельно они работают или нет на уровне процессоров. Ещё не факт что на мультипроцессорных будут параллельно работать

И не надо язвить. Я четко написал «паралельная работа возможна. » — что не есть эквивалент «паралельная работа гарантировано будет всегда. «

Сообщ. #11 , 17.06.09, 12:06
Рейтинг (т): 940
Цитата brother79 @ 17.06.09, 10:59

Если даже у тебя выполняется 1 поток — система может разнести его по ядрам, правда ускорение будет не в 2 раза, а где-то не более 30%, т.к. не все комманды можно по разным процам раскидывать, но механизма такая есть.

Что это за «механизма» такая ?!
На x86 точно ничего подобного нет (если речь идет о HyperThreading-е, то это совершенно другая петрушка)

Сообщение отредактировано: leo — 17.06.09, 12:07
Сообщ. #12 , 17.06.09, 13:48

Рейтинг (т): 640
Цитата leo @ 17.06.09, 12:06
Что это за «механизма» такая ?!
Это он видимо слышал что-то про OpenMP и понял по-своему.
Сообщ. #13 , 18.06.09, 01:24
Full Member
Рейтинг (т): 13
Цитата W_in_d @ 17.06.09, 09:54

Абсолютно неверный вариант, — работать как описано не будет. Application->ProcessMessages() вызывает обработку сообщений но не выходит из вызвавшей функции

Вы не совсем правы. Да, не выходит, но если сделать так, что после вызова ф-ии запускается Application->ProcessMessages(), вызывается обработка сообщений, потом или с таймера или с кнопки приходит сообщение на вызов новой ф-ии, в которой также в цикле вызывается Application->ProcessMessages(), то по сути после каждого вызова будет передаваться управление очередной ф-ии, хотя это и довольно странный способ, но в том случае когда с потоками делать не хочется — это вполне может работать. Например если на несколько кнопок повесить несколько долгих процедур, можно их запускать и не дожидаясь конца, запускать следующую.

Это он видимо слышал что-то про OpenMP и понял по-своему.

Я счас не скажу что это , я действительно слышал, но мне интересен был только алгоритм и факт наличия. Я не помню каждый exe можно так распределить или должен быть компилятор, который генерит особый код. Суть данного явления, что если 2 команды идут подряд, и они не связанны общими данными, ничего не мешает их пустить на разные потоки. И вроде как всётаки некоторые компиляторы оптимизируют код под мультипроцессорные системы, чтобы ставить комманды в таком пор-ке(где это возможно), чтобы их можно было пускать на разные потоки. Но не исключаю что реч могла идти про несколько конвееров в 1 проце, хотя врятли, да я и не вдавался в архитектуру современных процов, на каком уровне мультипроцессорность организуется, просто небыло необходимости..

Сообщение отредактировано: brother79 — 18.06.09, 01:35
Сообщ. #14 , 18.06.09, 08:33
Рейтинг (т): 940
Цитата brother79 @ 18.06.09, 01:24

да я и не вдавался в архитектуру современных процов, на каком уровне мультипроцессорность организуется, просто небыло необходимости..

Вдаваться в подробности не обязательно, а вот иметь общие представления не мешало бы, чтобы фильтровать услышанный звон

Во-первых, ядра это независимые процессоры реализованные внутри одного чипа (кристалла). В лучшем случае они имеют общий кэш 2-го уровня L2 (в интеловских архитектурах), а у АМД и вовсе обмен данными между кэшами разных ядер идет через шину памяти. Разумеется никакие отдельные команды между ядрами пересылаться не могут. Более того, поскольку кэши у разных ядер разные (по кр.мере L1), то даже одновременный доступ к близко расположенным изменяемым данным из разных ядер может приводить к заметному ухудшению производительности, т.к. изменение данных на одном ядре приводит к необходимости синхронизации содержимого соответствующих линеек кэша других ядер. Поэтому чем меньше разные ядра взаимодействуют друг с другом тем лучше.
Во-вторых, почему это так, а не иначе ?
Все суперкорости современных и процессоров, и ОЗУ и жестких дисков обязаны таким взаимосвязанным понятиям как предвыборка, пакетная передача (обработка) данных, кэширование и конвееризация. Поэтому все эти устройства работают быстро только при последовательном доступе к данным, а при произвольном скачкообразном доступе скорость падает в десятки раз. Ес-но тоже самое относится и к потоку команд в процессоре, т.к. прежде чем выполнить команды нужно сначала считать блок команд из кэша, декодировать их (причем в x86 команды имеют переменную длину и соотв-но могут декодироваться только последовательно) и поставить в очередь на исполнение. За счет блочного чтения и конвееризации непрерывный поток команд выполняется быстро, а вот при наличии непредсказуемых переходов\скачков скорость может упасть в десятки раз (15-30 в зависмости от длины конвеера). Для устранения\уменьшения задержек на переходах в современных процах юзаются спец.навороченные схемы «предсказания переходов», чтобы заблаговременно подгружать из кэша новый блок команд. Разумеется на каждом ядре предвыборка и декодирование команд производятся независимо и ни о каком «обмене командами» речи идти не может.
Резюме: каждое ядро процессора предназначено для исполнения своей непрерывной последовательности команд, т.е. с точки зрения процессора, поток это и есть последовательность команд, исполняемых на одном ядре (или логическом процессоре в HyperThreading’е). Поэтому для распараллеливания обработки на разных ядрах нужно юзать многопоточность либо в явном виде, либо в неявном через OpenMP

Сообщение отредактировано: leo — 18.06.09, 08:34
Сообщ. #15 , 18.06.09, 10:28

Senior Member
Рейтинг (т): 33
Цитата brother79 @ 18.06.09, 01:24

Вы не совсем правы. Да, не выходит, но если сделать так, что после вызова ф-ии запускается Application->ProcessMessages(), вызывается обработка сообщений, потом или с таймера или с кнопки приходит сообщение на вызов новой ф-ии, в которой также в цикле вызывается Application->ProcessMessages(), то по сути после каждого вызова будет передаваться управление очередной ф-ии, хотя это и довольно странный способ, но в том случае когда с потоками делать не хочется — это вполне может работать. Например если на несколько кнопок повесить несколько долгих процедур, можно их запускать и не дожидаясь конца, запускать следующую.

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

Еще раз подчеркну, в корне не верно вот это утверждение:

то по сути после каждого вызова будет передаваться управление очередной ф-ии

Этого происходить не будет, максимум чего можно при этом достичь, это повторный запуск первой второй или n-ной функции по кнопке/таймеру или другому событию, т.е. не продолжения работы предыдущей функции а именно повторный запуск.

Что такое callback-функция в JavaScript?

Что такое callback-функция в JavaScript? главное изображение

Простыми словами: коллбэк — это функция, которая должна быть выполнена после того, как другая функция завершила выполнение (отсюда и название: callback — функция обратного вызова).

Чуть сложнее: В JavaScript функции — это объекты. Поэтому функции могут принимать другие функции в качестве аргументов, а также возвращать функции в качестве результата. Функции, которые это умеют, называются функциями высшего порядка. А любая функция, которая передается как аргумент, называется callback-функцией.

Зачем нужны коллбэки?

По одной простой причине: JavaScript — это событийно-ориентированный язык. Поэтому вместо того, чтобы ждать ответа для дальнейшего выполнения программы, JavaScript продолжит выполнение, одновременно ожидая других событий. Давайте разберем простой пример:

const first = () =>  console.log(1); >; const second = () =>  console.log(2); >; first(); second(); 

Как вы и ожидаете, функция first выполнится первой, а функция second уже после нее. Поэтому в консоли будет выведен следующий результат:

Пока что все понятно. Но что, если функция first содержит некий код, который не может выполниться немедленно? К примеру, работа с API, где мы отправляем запрос и должны ждать ответа. Чтобы смоделировать такую ситуацию, мы используем функцию setTimeout , которая вызывает функцию после заданного временного промежутка. Мы отсрочим выполнение функции на 500 миллисекунд, как будто бы это запрос к некому API. Теперь код будет выглядеть так:

const first = () =>  // Как будто бы запрос к API setTimeout(() =>  console.log(1); >, 500 ); >; const second = () =>  console.log(2); >; first(); second(); 

Неважно, понимаете ли вы сейчас, как работает setTimeout() . Основная идея — теперь мы отложили исполнение команды console.log(1) на 500 миллисекунд. И что теперь выведет наша программа?

Хотя мы по-прежнему вызываем функцию first первой, ее вывод появился вторым, после вывода функции second . Но JavaScript не нарушает порядок вызова функций, он просто не дожидается ответа от функции first , а сразу двигается дальше — к функции second .

Поэтому нельзя просто вызывать функции в нужном порядке и надеяться, что они в любом случае выполнятся в том же порядке. Коллбэки же позволяют нам быть уверенными в том, что определенный код не начнет исполнение до того момента, пока другой код не завершит исполнение.

Фронтенд-разработчик — с нуля до трудоустройства за 10 месяцев

  • Постоянная поддержка от наставника и учебного центра
  • Помощь с трудоустройством
  • Готовое портфолио к концу обучения
  • Практика с первого урока

Вы получите именно те инструменты и навыки, которые позволят вам найти работу

Создаем коллбэк

Во-первых, откройте консоль разработчика в Google Chrome (Windows: Ctrl + Shift + J)(Mac: Cmd + Option + J), либо свой IDE, либо просто Repl.it , и введите в консоли следующую функцию:

const doHomework = (subject) =>  alert(`Starting my $subject> homework.`); >; 

Мы создали функцию doHomework . Наша функция принимает одну переменную — название предмета, которым мы будем заниматься. Вызовите функцию, набрав следующий текст в консоли:

doHomework('math'); // Выводит алерт: Starting my math homework. 

Теперь давайте добавим в определение функции еще один параметр, это и будет наш коллбэк. Затем вызовем ее, определив функцию-callback в качестве аргумента:

const doHomework = (subject, callback) =>  alert(`Starting my $subject> homework.`); callback(); >; doHomework('math', () =>  alert('Finished my homework'); >); 

Если вы введете этот код в консоли, вы получите два алерта один за другим, в первом будет сообщение о том, что выполнение домашнего задания началось (Starting my math homework.), а во втором — что вы закончили выполнять задание (Finished my homework).

Однако коллбэки не обязательно должны быть определены при вызове функции. Они могут быть определены и в другом месте кода, например, так:

const doHomework = (subject, callback) =>  alert(`Starting my $subject> homework.`); callback(); >; const alertFinished = () =>  alert('Finished my homework'); >; doHomework('math', alertFinished); 

Таким образом, результат выполнения этого кода такой же, как и в предыдущем примере, однако сам код немного другой. Как вы видите, мы передали функцию alertFinished как аргумент в функцию doHomework при ее вызове.

Перепишем пример вызова функции с setTimeout для последовательного выполнения функций:

const first = (callback) =>  // Как будто бы запрос к API setTimeout(() =>  console.log(1); callback(); >, 500 ); >; const second = () =>  console.log(2); >; first(second); // 1 // 2 

Пример из реальной жизни

На прошлой неделе я опубликовал статью «Создаем бота для Твиттера в 38 строк кода» . Этот код работает благодаря API Твиттера. И когда мы делаем запрос к API, мы должны дождаться ответа до того, как начнем выполнять с этим ответом какие-то действия. Это прекрасный пример того, как в реальной жизни выглядит коллбэк. Вот как выглядит сам запрос:

T.get('search/tweets', params, (err, data, response) =>  if (!err)  // Происходит какая-то магия > else  console.log(err); > >); 

T.get просто значит, что мы выполняем get запрос к API Твиттера. В запросе три параметра: ‘search/tweets’ – это адрес (роут) запроса, params – наши параметры поиска и в конце передается анонимная функция-callback.

Коллбэк здесь нужен, потому что нам нужно дождаться ответа от сервера до того, как приступим к дальнейшему выполнению кода. Мы не знаем, успешным будет наш запрос или нет, поэтому после отправки параметров поиска на search/tweets через get-запрос, мы просто ждем. Как только Твиттер ответит, выполнится наша callback-функция. Твиттер отправит нам в качестве ответа или объект err (error – ошибка), или объект response. В коллбэке мы можем через if() проверить, был ли запрос успешным или нет, и затем действовать соответственно.

Профессия «Фронтенд-разработчик»

  • Изучите востребованные JavaScript и TypeScript
  • Научитесь создавать пользовательские интерфейсы сайтов и приложений
  • Освойте самый популярный фреймворк JavaScript — React
  • Познакомьтесь с языками веб-разработки HTML и CSS

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *