BG Development


Страници: (2) [1] 2   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Помощ за Python (multiprocessing и threading)
dedal
Публикувано на: 23-08-2021, 11:24
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Активен

Мнения: 152
Регистриран на: 17.11.10



Имам една много сложна програма.
На кратко вдига 7 процеса които отговарят за различни неща.

Голяма част от процесите подават инфо към UDP сървър и се ражда проблем:
Инфо от сървъра пристига при процес без да е предназначен за него.

Решение: Вдигам нов процес който само да изпраща инфо като комуникира с Pipe с останалите (отделен Pipe са всеки изпращач)

Това решава проблем защото влизат в изчакване и всеки получава каквото е предназначено за него.

И започва сложното:
Единия от въпросните 7 процеса забива когато падне сървъра. Просто влиза с while и подава непрекъснат сигнал към изпращач като чака отговор, така кода не продължава до края а просто спира там.

Решение да вдигна threading за изпращане и да продължа като оставя трейда да се оправя сам.
Обаче същия процес може да вдигне до 10 трейда.

Питанка:
Как да синхронизирам Pipe между трейдовете. Сетих се за Lock обаче това ще роди проблема заради който съм го сложил този Pipe и няма да знам кой трейд получава и за кого е предназначена информацията.
PMEmail Poster
Top
dedal
Публикувано на: 23-08-2021, 11:46
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Активен

Мнения: 152
Регистриран на: 17.11.10



Сетих се. Вдигам един трейд да праща синхронизирам го с PriorityQueue() оставям го да се оправи и карам по редицата.

Аз като напиша какъв ми е зора и ми светва icon_smile.gif
PMEmail Poster
Top
ici
Публикувано на: 23-08-2021, 11:50
Quote Post


Group Icon
Име: Ивайло Илчев
Група: VIP
Ранг: Почетен член

Мнения: 17669
Регистриран на: 06.06.04



Използвай QUdpSocket, QThread, QThreadPool от PySide2. Вместо процеси имаш истински нишки и използваш слотове и сигнали за комуникация



--------------------
Ние не сме в една лодка, ние сме в една буря. Лодките са различни.

Следващият път когато се почувстваш ненужен, грозен и недооценен, помни че освен това си и тъп.
PMEmail PosterUsers Website
Top
dedal
Публикувано на: 23-08-2021, 12:07
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Активен

Мнения: 152
Регистриран на: 17.11.10



QUOTE (ici @ 23-08-2021, 11:50)
Използвай QUdpSocket, QThread, QThreadPool от PySide2. Вместо процеси имаш истински нишки и използваш слотове и сигнали за комуникация

С PySide2 не съм запознат и може да греша, но на първо четене е нещо свързано с Qt и графика.
А аз нямам нито мишок, нито графика, а 5 серийни порта, 10 релета и ARM на който Qt ще сложа с голям зор, като не е сигурно колко ще бачка.

Пак казвам може да греша: Можеш ли да дадеш пример някакъв за управление с 2-5 реда?
PMEmail Poster
Top
ici
Публикувано на: 23-08-2021, 12:22
Quote Post


Group Icon
Име: Ивайло Илчев
Група: VIP
Ранг: Почетен член

Мнения: 17669
Регистриран на: 06.06.04



В ляво (1) е клас за комуникация, в дясно (2) е слот за четене при пристигнали символи.

Това мнение е било редактирано от ici на 23-08-2021, 12:28

Прикачена картинка (Кликнете на картинката, за да я увеличите!)
Прикачена картинка


--------------------
Ние не сме в една лодка, ние сме в една буря. Лодките са различни.

Следващият път когато се почувстваш ненужен, грозен и недооценен, помни че освен това си и тъп.
PMEmail PosterUsers Website
Top
ici
Публикувано на: 23-08-2021, 12:24
Quote Post


Group Icon
Име: Ивайло Илчев
Група: VIP
Ранг: Почетен член

Мнения: 17669
Регистриран на: 06.06.04



Това е без гуи


Прикачена картинка
Прикачена картинка


--------------------
Ние не сме в една лодка, ние сме в една буря. Лодките са различни.

Следващият път когато се почувстваш ненужен, грозен и недооценен, помни че освен това си и тъп.
PMEmail PosterUsers Website
Top
thrawn
Публикувано на: 23-08-2021, 12:28
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3141
Регистриран на: 17.01.17



@dedal, нещо ти куца логиката.

При udp нямаш гаранция за доставяне на пакет, което значи, че дори да си на една нишка нямаш гаранция за получаване и на отговор (дори той да не е udp). От тук следва, че ти трябват независими обработки на изпращане и получаване на данни (процеси, нишки, неблокиращи сокети ...).
Ако работата на изпращачите е обвързана по някакъв начин с получаването на отговор, то в тях се реализира и логика за таймаут (допустимо време за изчакване на отговорът) и ако такъв не постъпи се предприемат съответните действия (в зависимост от логиката на приложението).

Ако отговорите са насочени към една и съща логика (процес да речем) за обработка (безсмислено е да се стартира отделна такава за всеки изпращач) то в тях следва да има идентификатор на получателя (да речем PID) по който да се подават на съответния процес.

Как ще го реализираш това на питон нямам идея...

Това мнение е било редактирано от thrawn на 23-08-2021, 12:29
PMEmail Poster
Top
dedal
Публикувано на: 23-08-2021, 12:31
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Активен

Мнения: 152
Регистриран на: 17.11.10



QUOTE (ici @ 23-08-2021, 12:22)
В ляво (1) е клас за комуникация, в дясно (2) е слот за четене при пристигнали символи.

Яко, но е TCP ако не греша, там протокола разчита на канекция и си пускаш сървъра в threading режим което никога няма да ти обърка две канекции идващи от различен софтуерен порт. С TCP и аз нямам проблеми. При мен е UDP и сървъра не е в трейд, а изпълнява сигнал след сигнал и връща.
PMEmail Poster
Top
dedal
Публикувано на: 23-08-2021, 12:36
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Активен

Мнения: 152
Регистриран на: 17.11.10



QUOTE (thrawn @ 23-08-2021, 12:28)
@dedal, нещо ти куца логиката.

При udp нямаш гаранция за доставяне на пакет, което значи, че дори да си на една нишка нямаш гаранция за получаване и на отговор (дори той да не е udp). От тук следва, че ти трябват независими обработки на изпращане и получаване на данни (процеси, нишки, неблокиращи сокети ...).
Ако работата на изпращачите е обвързана по някакъв начин с получаването на отговор, то в тях се реализира и логика за таймаут (допустимо време за изчакване на отговорът) и ако такъв не постъпи се предприемат съответните действия (в зависимост от логиката на приложението).

Ако отговорите са насочени към една и съща логика (процес да речем) за обработка (безсмислено е да се стартира отделна такава за всеки изпращач) то в тях следва да има идентификатор на получателя (да речем PID) по който да се подават на съответния процес.

Как ще го реализираш това на питон нямам идея...

Гаранцията за доставяне аз съм си я реализирал сам с криптирането. Значи или всички пакети идват на цяло или нищо не се обработва. И точно заради timeout е UDP вместо TCP.

В 85% от случаите трябва да набия на сървъра с timeout=0 без да вдигна грешка и без да се интересувам дали е стигнало. Комуникацията е към два сървъра, единия просто взима инфо и не връща, другия трябва да върне 100% цяло без загуби.

От друга страна PID не ми върши работа, само ражда повече проблеми, застава една лелка на компа и цъка човката пусни-спри процес с идеята че е facebook.
То вдига различен PID обаче wathdog си фи пляска в PIPE и пренатоварва размера ако няма кой да го вземе (нали PID го няма вече)

Това мнение е било редактирано от dedal на 23-08-2021, 12:47
PMEmail Poster
Top
dedal
Публикувано на: 23-08-2021, 12:51
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Активен

Мнения: 152
Регистриран на: 17.11.10



QUOTE (ici @ 23-08-2021, 12:24)
Това е без гуи

При мен е така:

CODE

   def send(self, evt, ip, port, timeout, udp_buffer, **kwargs):
       response = None
       try:
           my_client = client.Client(ip=ip, port=port, log=self.log, timeout=timeout, udp_buffer=udp_buffer, crypt=self.crypt)
           response = my_client.send(evt, **kwargs)
       except BadCript:
           response = None
          self.log.critical('BAD RSA SIGNATURE')
       except Exception as e:
           response = None
           self.log.error('ip: %s port:%s evt: %s kwargs: %s' % (ip, port, evt, kwargs))
           self.log.error(e, exc_info=True)
           # return None
       finally:
           try:
               my_client.close()
           except:
               pass
       return response


И да не се чудите защо вдигам различен обект. Просто evt е за различни сървъри

Това мнение е било редактирано от dedal на 23-08-2021, 13:04
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (2) [1] 2  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0