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?
Asynchrone Programmierung & GUI
- 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
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.MoonKid hat geschrieben:18.12.2017 13:56:21Den 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?
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!
Re: Asynchrone Programmierung & GUI
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.Lord_Carlos hat geschrieben:18.12.2017 14:30:58Zum problem wird es wenn zwei Thread Zeitgleich ein Newsfeed runtergeladen haben und z.B. zeitgleich zum gleichen Array hinzufuegen wollen. Oder zur Datenbank.
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.
Re: Asynchrone Programmierung & GUI
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
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.