Funktion im Hintergrund ausführen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Hallo, kann man eine Funktion auch im Hintergrund ausführen lassen und so dass das eigentliche Programm weiter arbeiten kann?
Hier mal ein Beispiel:

Code: Alles auswählen

import time

def test():
    print("hello world")
    time.sleep(3)

for i in e:
    if i == x:
        test()
    hier weitere anweisung wo parallel die Funktion
    ausgeführt wird
Also sollen die Anweisungen weiter laufen unabhängig von der Funktion.
Gruß
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Das ist m. M. n. eine Architekturfrage, die sich am Besten am ganz konkreten Anwendungsfall beantworten lässt. So abstrakt ist das eher schwierig.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Am einfachsten wäre doch ein anderes Programm zu starten oder?
Ich dachte es gibt eine generelle Variante wie man Programme isoliert ausführen kann.
Beim googeln habe ich leider auch nichts brauchbares gefunden.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Was für eine Funktion möchtest du denn im Hintergrund ausführen? Es gibt etliche Möglichkeiten, weil es keiner allgemeingültige Antwort auf die Frage gibt.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Die soll etwas in über das Internet schicken (z.B. FTP), falls das die Adresse mal schwer zu erreichen ist, dauert es ja ein bisschen, aber es soll ja im Programm weiter gehen.

Ein anderes Programm zu starten wäre keine gute Idee?

Und dann gibt es ja noch asyncio.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Genau, wenn man viele Internetverbindungen gleichzeitig hat, ist async eine Lösung.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

OK. und ein anderes Programm ausführen lassen?
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

also mit async würde das so aussehen:

Code: Alles auswählen

import time
import asyncio

async def test1():
    print("test 1")
    time.sleep(5)
    print("test 1 ist fertig")

async def test2():
    print("test 2")

async def main():
    a = test1()
    b = test2()
    await asyncio.wait([a, b])

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

egon11 hat geschrieben: Samstag 20. März 2021, 11:43 also mit async würde das so aussehen:

Code: Alles auswählen

import time
import asyncio

async def test1():
    print("test 1")
    time.sleep(5)
    print("test 1 ist fertig")

async def test2():
    print("test 2")

async def main():
    a = test1()
    b = test2()
    await asyncio.wait([a, b])

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
Edit: Ich habe noch etwas einfacheres gefunden:

Code: Alles auswählen

import time
from concurrent import futures

def test1():
    print("test 1")
    time.sleep(5)
    print("test 1 ist fertig")

def test2():
    print("test 2")

e = futures.ThreadPoolExecutor()
e.submit(test1)
e.submit(test2)
e.shutdown() 

Würde doch auch gehen oder?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist halt jetzt was komplett anderes. Und wie schon geschrieben, kann man an so dummy-Beispielen nicht wirklich erklären, was die beste Variante wäre.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei wenn es ums hochladen per FTP geht so ein `ThreadPoolExecutor` schon gehen würde. Mit einer Poolgrösse die angibt wie viele Uploads maximal parallel laufen dürfen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Mir geht es eigentlich nur darum, dass ich 2 Funktionen gleichzeitig ausführen kann. Ich dachte da gibt es eine generelle Lösung.
Aber wenn nichts gegen "concurrent" würde ich das nehmen.
Antworten