Форум сайта python.su
Доброго времени суток, помогите пожалуйста вот с такой задачей. Нужно запустить два цикла одновременно. К примеру имеется две функции
def loop1(): for i in range(10): i += 1 print (i) def loop2(): for i in range(10): i += 1 print (i) loop1() loop2()
Отредактировано Darkhan (Апрель 3, 2017 16:35:48)
Офлайн
Чтобы переключаться между функциями loop1 и loop2, вполне достаточно обычных генераторов и здесь совершенно не нужен никакой async:
def loop1(): for i in range(10): i += 1 print('I am the loop1:', i) yield def loop2(): for i in range(10): i += 1 print('I am the loop2:', i) yield task1 = loop1() task2 = loop2() try: while True: next(task1) next(task2) except StopIteration: pass
from multiprocessing import Process def loop1(): for i in range(10): i += 1 print('I am the loop1:', i) def loop2(): for i in range(10): i += 1 print('I am the loop2:', i) p1 = Process(target=loop1) p2 = Process(target=loop2) p1.start() p2.start()
Офлайн
https://habrahabr.ru/post/149420/
Офлайн
scidamспасибо большое, то что нужно, теперь другая проблема. У меня UI(User Interface) с полями логин и пароль и функция, которая отправляет запрос на авторизацию. Как сделать так, чтобы вот эта функция ждала пока не получит данные с полей логин и пароль и чтобы UI во время отправки запроса продолжал свою работу. А то я запускаю оба эти процесса (UI и отправка запроса) и получается, что функция еще не получила данные с полей логин и пароль, сразу же отправляет запрос на сервер
Чтобы переключаться между функциями loop1 и loop2, вполне достаточно обычных генераторов и здесь совершенно не нужен никакой async:
Офлайн
scidam
Чтобы переключаться между функциями loop1 и loop2, вполне достаточно обычных генераторов и здесь совершенно не нужен никакой async:
import sys import requests from multiprocessing import Process from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtQuick import * from PyQt5.QtQml import * from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from api import Api # engine = create_engine('sqlite:///data/sim.db') # Session = sessionmaker(bind=engine) if __name__ == '__main__': # session = Session() class Gui(object): # myApp = None appLabel = None # ctx = None win = None login = None password = None button = None gui = Gui() api = Api() myApp = QApplication(sys.argv) gui.appLabel = QQmlApplicationEngine() ctx = gui.appLabel.rootContext() ctx.setContextProperty("main", gui.appLabel) def m_gui(): # User Interface gui.appLabel.load('MessengerGUI/main.qml') gui.win = gui.appLabel.rootObjects()[0] gui.login = gui.win.findChild(QQuickItem, "login") gui.password = gui.win.findChild(QQuickItem, "password") gui.button = gui.win.findChild(QQuickItem, "button") def button_click(): # When button clicked send auth request to server api.auth(gui.login.property('text'), gui.password.property('text')) print(api.access_token, api.home_server, api.user_id, api.device_id) m_gui() gui.button.clicked.connect(button_click) gui_process = Process(target=m_gui()) button_process = Process(target=button_click()) gui_process.start() button_process.start() gui.win.show() sys.exit(myApp.exec_())
Офлайн
Это все меняет. У меня нет достаточного опыта разработки GUI, а установить и попобовать сейчас Pyqt у меня нет возможности. Однако, сразу могу сказать, что много странных вещей:
1) странно, что класс Gui определен внутри __name__ == ‘__main__’; Вы планируете использовать программу как модуль, если нет, то вообще не нужно это условие __name__ == ‘__main__’
2) Gui класс – а зачем он, если у него нет методов; вместо класса Gui можно и так: gui = {'app_label': None, ‘win’: None, …} т.е. использовать просто словарь; скорее всего, конечно, класс нужен, с подходящими методами; но в рамках данной структуры программы – он не нужен.
3)
Как сделать так, чтобы вот эта функция ждала пока не получит данные с полей логин и пароль и чтобы UI во время отправки запроса продолжал свою работу
Офлайн
Darkhanну так Qt событийно ориентированая система, определите событие(например нажали кнопку “войти”) и запускайте вашу процедуру авторизации тоько после этого события.
Как сделать так, чтобы вот эта функция ждала пока не получит данные с полей логин и пароль и чтобы UI во время отправки запроса продолжал свою работу.
button_process = Process(target=auth()) button_process.start()
[code python][/code]
Офлайн
PEHDOMМне нужно добиться того, чтобы когда я отправлял запрос на сервер, GUI в это время работало. А то во время запроса на сервер и получения токена, GUI зависает и отвисвет только когда я получаю токен
Офлайн
ну так и запускайте запрос в отдельном процессе, ГУЙ будет дальше продолжать работать как работал.
[code python][/code]
Офлайн
PEHDOMэто понятно, но вот оба потока не могут брать данные с одной переменной. Данные логин и пароль записываются в переменные управляющего потока, я не знаю как из второго потока получить данные с управляющего потока. Если тупо их вызывать из второго потока, то получается конфликт между потоками
ну так и запускайте запрос в отдельном процессе, ГУЙ будет дальше продолжать работать как работал.
Офлайн