2
votes

Existe-t-il un moyen de créer une boucle qui s'exécute en arrière-plan tandis que d'autres codes continuent de s'exécuter en python?

Je suis vraiment novice en programmation, je me demandais s'il y avait un moyen d'exécuter une boucle while en arrière-plan du code déjà exécuté en Python?

Je pensais à quelque chose comme

Tant que vrai: print ("charabia") print ("pass")

avec une sortie de quelque chose comme:

'charabia charabia passer charabia ..... '

(Il n'est pas nécessaire que ce soit dans cet ordre tant que j'obtiens un résultat similaire)


4 commentaires

Vous devriez rechercher le multitraitement / multithreading.


Jetez un œil à cette réponse stackoverflow.com/a/3221320/3920623


threading.Thread


Doublon possible de Création de threads en python


3 Réponses :


2
votes

Vous pouvez utiliser le multiprocessing ou threading :

def background_code():
    while some_condition:
        print("gibberish")

...
thread = threading.Thread(target=background_code, args=(), kwargs={})
thread.start()
print("pass")
...


5 commentaires

Je ne pense pas que cela afficherait jamais "pass" .


C'est vrai; cependant, cela ressemble le plus au code présenté dans la question et je pense que c'est assez évident


Je crois que ce serait très utile pour les futurs lecteurs si vous pouviez montrer comment exécuter la boucle while dans un autre thread tout en faisant autre chose (comme imprimer "pass") dans le thread principal.


@Selcuk Bonne idée. Modifié en conséquence.


les coroutines sont une alternative à la fois au multitraitement et au threading (pas du tout en désaccord avec ces choix) - fournissant simplement une troisième option



0
votes

Voici quelque chose de similaire en utilisant asyncio (nécessite python 3.7+):

import asyncio

async def loop():
    while True:
        print("gibberish")
        await asyncio.sleep(0.5)

async def main():
    future = asyncio.ensure_future(loop())
    for i in range(100):
        print("pass")
        await asyncio.sleep(1)
    future.cancel()
asyncio.get_event_loop().run_until_complete(main())    

Cela affichera deux charabia pour chaque passer . Vous pouvez changer la durée du sommeil pour changer le rapport.

Ici, main et boucle sont coroutines , où une seule est exécutée à la fois. Les appels await ... sont des points où l'exécution est potentiellement cédée à d'autres coroutines.


0 commentaires

1
votes

Vous pouvez vous référer au code suivant.

import threading

def func1():
    for i in range(10):
        print("gibberish")

def func2():
    print("pass")

t1 = threading.Thread(target=func1)
t2 = threading.Thread(target=func2)


if __name__ == '__main__':
    t1.start()
    t2.start()

Il exécute simultanément les méthodes func1 et func2 afin que les méthodes fournies s'exécutent en tâche de fond l'une pour l'autre.


0 commentaires