Asynchrone Programmierung & GUI

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Asynchrone Programmierung & GUI

Beitrag von MoonKid » 18.12.2017 13:56:21

Den Unterschied zwischen asynchroner Programmierung und Multithreading hab ich in etwa verstanden - aber nicht gerade verinnerlicht. Multithreading habe ich noch am Leerbeispiel eines Chat-Servers kennengelernt, wo für jeden User ein eigener Thread aufgemacht wurde. Das wars dann aber auch mit meinen Erfahrungen.

Nun muss ich Newsfeeds (beispielsweise 100 Stück) "gleichzeitig" herunterladen. Es geht also im Grunde um xml-artige Dateien, unterschiedlicher Größe und relativ unterschiedlicher Antwortzeiten der Gegenstellen.

Den erste Frage ist nun, ob asychrone Programmierung überhaupt ein geeigneter Lösungsansatz für diese Aufgabe wäre? Die Anwendung bzw. die GUI soll wärend dem Herunterladen nicht einfrieren. Gibt es evtl. andere Konzepte oder Lösungsansätze für so ein Szenario?

Die zweite Frage wäre, wie man das mit einer GUI kombiniert. Asynchrone Programmierung arbeitet ja mit einer Art Event-Loop. Eine GUI tut das aber auch. Ergo: Da sind zwei konkurierende Loops. Konkret geht es um Python3.5 mit Tkinter und asyncio. Für Alternativen zu asyncio wäre ich offen. Von Python und Tkinter möchte ich nur ungern abrücken. Hab schon workarounds gesehen, wo der asyncio-EventLoop regelmäßig den Tkinter-Loop aufruft. Aber ist sowas sauber?

Bin ich vielleicht total auf dem Holzweg?

Benutzeravatar
Lord_Carlos
Beiträge: 5578
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: Asynchrone Programmierung & GUI

Beitrag von Lord_Carlos » 18.12.2017 14:30:58

MoonKid hat geschrieben: ↑ zum Beitrag ↑
18.12.2017 13:56:21
Den erste Frage ist nun, ob asychrone Programmierung überhaupt ein geeigneter Lösungsansatz für diese Aufgabe wäre? Die Anwendung bzw. die GUI soll wärend dem Herunterladen nicht einfrieren. Gibt es evtl. andere Konzepte oder Lösungsansätze für so ein Szenario?
Genau dafuer ist es ja da. Im Hintergrund, asyncron zu dem was der Benutzter gerade macht tueftelt ein Thread vor sind hin und laedt die Newsfeeds runter.

Zum problem wird es wenn zwei Thread Zeitgleich ein Newsfeed runtergeladen haben und z.B. zeitgleich zum gleichen Array hinzufuegen wollen. Oder zur Datenbank.

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: Asynchrone Programmierung & GUI

Beitrag von MoonKid » 18.12.2017 14:59:31

Lord_Carlos hat geschrieben: ↑ zum Beitrag ↑
18.12.2017 14:30:58
Zum problem wird es wenn zwei Thread Zeitgleich ein Newsfeed runtergeladen haben und z.B. zeitgleich zum gleichen Array hinzufuegen wollen. Oder zur Datenbank.
Das hatte ich anders verstanden, da bei asynchroner Programmierung ja eigentlich nicht wirklich etwas gleichzeitg passiert, sondern die Jobs hintereinander abgearbeitet. werden. Hängt von der Implementierung ab, die natürlich trotzdem multithreaded sein kann. Ggf. gibt es dann (in asynycio) sicher auch Mechanismen um Datenstrukturen blockieren zu können.
Stell dir 100 Jobs vor, die je einen Feed laden und zum gleichen Array hinzufügen. ;) Mir ist klar, dass das auch ein Problem ist, dass ich lösen muss, aber soweit wollte ich hier noch nicht reinsteigen.

Bin mir nicht sicher, ob meine Aufgabe für asynchrone Programmierung überhaupt geeigent ist, oder ob es eine einfachere Lösung gäbe.

Benutzeravatar
shoening
Beiträge: 898
Registriert: 28.01.2005 21:05:59
Lizenz eigener Beiträge: MIT Lizenz

Re: Asynchrone Programmierung & GUI

Beitrag von shoening » 18.12.2017 20:19:58

Hi,

Multithreading ist meiner Meinung nach die richtige wahl.

In der von mir hauptsächlich genutzten Programmiersprache „Java“ würde ich dafür einen Threadpool - Du kannst ja nicht beliebig viele
Threads gleichzeitig laufen lassen.

In einer Schleife dann für jede Datei einen Thread aus dem Pool nehmen, der die Datei herunterlädt, und dann wieder in den Pool zurücklegen.

Man kann dann - denke ich - ruhig den Pool etwa doppelt so groß machen, wie man Kerne zur Verfügung hat.

So in der Art ticken auch die bekannten Java-WebServer (Tomcat, Jetty, ...) um Requests zu bearbeiten.

Ciao
Stefan
Bürokratie kann man nur durch ihre Anwendung bekämpfen.

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: Asynchrone Programmierung & GUI

Beitrag von MoonKid » 18.12.2017 21:28:15

shoening hat geschrieben: ↑ zum Beitrag ↑
18.12.2017 20:19:58
Multithreading ist meiner Meinung nach die richtige wahl.
Und warum?
shoening hat geschrieben: ↑ zum Beitrag ↑
18.12.2017 20:19:58
In der von mir hauptsächlich genutzten Programmiersprache „Java“ würde ich dafür einen Threadpool
Ah, das Konzept war mir neu. Interessant.

Antworten