Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème gestion de mémoire thread

    24 janvier 2015 à 17:27:44

    Bonjour à tous,

    J'ai récemment crée un script qui simule l'utilisation d'un navigateur (librairie mechanize), pour cela j'utilise un thread qui répète des actions dans une boucle infinie, je mets le thread en pause pendant 1 sec et il recommence. Or, mon problème est le suivant, au fur et à mesure que le temps passe mon script utilise de plus en plus de ressources sur mon vps et fini par crasher suite à la limite autorisée en mémoire par mon hébergeur.

    Comment peut-on résoudre ce problème ?

    Merci de vos réponses.

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      24 janvier 2015 à 17:36:21

      Vends Boule de Crystal, 500€

      T'as les boules ? *Fourni avec son socle et les réponses à toutes vos questions (aussi vide soient-elles) !



      <br/> Récemment vernis pour plus d'authenticité. :)

      -
      Edité par Anonyme 24 janvier 2015 à 17:47:58

      • Partager sur Facebook
      • Partager sur Twitter
        24 janvier 2015 à 17:40:22

        Ahaha pas mal cette petite boule de cristal :p (t'as oublié un 't' au fait).

        Si il prend trop de mémoire, ça veut dire que tu as une fuite mémoire quelque part, ou que tu as mal conçu ton code (plus probable), mais vu qu'on est pas dans ta tête, on ne voit pas le code. Par ailleurs, merci d'utiliser la balise code (le bouton </>) pour mettre ton code dedans, merci.

        • Partager sur Facebook
        • Partager sur Twitter
          24 janvier 2015 à 17:50:49

          # -*- coding: Latin-1
          __author__ = 'Fx998'
          
          ###########
          ##IMPORTS##
          ###########
          
          import time
          import pickle
          import mechanize
          from threading import Thread
          from Config import ConfigManager
          from Parser import ParserManager
          from Status.StatusManager import *
          from Attack import AttackManager
          from Build import BuildManager
          from Parties import PartiesManager
          from Market import MarketManager
          
          #########
          ###VARS##
          #########
          
          c27While = True
          nav = mechanize.Browser()
          nav.addheaders[0] = ("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1623.0 Safari/537.36")
          threadList = []
          exitMenu = False
          
          
          #############
          ##FUNCTIONS##
          #############
          
          
          #############
          ###CLASSES###
          #############
          
          class Bot(Thread):
              """The thread Bot"""
          
              def __init__(self):
                  Thread.__init__(self)
                  self.Terminated = False
          
              def run(self):
                  """While running"""
          
                  while not self.Terminated:
                      #print("START")
                      #BuildManager.checkbuilds()
                      #PartiesManager.test()
                      #ParserManager.parsecheck(nav)
                      AttackManager.send(nav)
                      MarketManager.sendtasks(nav)
                      PartiesManager.doparties(nav)
                      time.sleep(1)
          
              def stop(self):
                  """Killing the thread"""
          
                  self.Terminated = True
          
          
          ##############
          #####BODY#####
          ##############
          
          print("c27 BOT")
          loggedIn = ConfigManager.login(nav)[1]
          MarketManager.reset()
          AttackManager.reset()
          print("Options List:")
          print("(1): Start the Bot\n(2): Stop the Bot\n(3): Attack Manager\n(4): Build Manager\n(5): Parties Manager\n(6): Market Manager\n(7): EXIT")
          while c27While and loggedIn == True:
              data = raw_input(">>>: ")
              datastr = str(data)
          
              if datastr == "1":
                  if len(threadList) > 1:
                      print("c27 bot is already launched ! Stop it before run !")
                  else:
                      t = Bot()
                      t.start()
                      threadList.append(t)
              elif datastr == "2":
                  t.stop()
                  print("c27 bot is stopped !")
              elif datastr == "3":
                  while exitMenu == False:
                      print(">>>[ATTACK MANAGER]<<<\n(1): Add Raid Task\n(2): Edit Raid Task\n(3): Delete Raid Task\n(4): Edit Repeat all\n(5): Exit AttackManager")
                      data = raw_input(">>>Your Attack Option Choice: ")
                      choice = str(data)
          
                      if choice == "1":
                          AttackManager.addraid()
                      elif choice == "2":
                          AttackManager.editraid()
                      elif choice == "3":
                          AttackManager.deleteraid()
                      elif choice == "4":
                          AttackManager.changeRepeat()
                      elif choice == "5":
                          print("Exiting AttackManager !")
                          exitMenu = True
                      else:
                          print("Invalid Command, Try again !")
                  exitMenu = False
          
              elif datastr == "4":
                  pass
              elif datastr == "5":
                  pass
              elif datastr == "6":
          
                  while exitMenu == False:
          
                      print(">>>[MARKET MANAGER]<<<\n(1): Add Market Task\n(2): Edit Market Task\n(3): Delete Market Task\n(4): Exit MarketManager")
                      data = raw_input(">>>Your Market Option Choice: ")
                      choice = str(data)
          
                      if choice == "1":
                          MarketManager.addmarkettask()
                      elif choice == "2":
                         MarketManager.editmarkettask()
                      elif choice == "3":
                           MarketManager.deletemarkettask()
                      elif choice == "4":
                          print("Exiting MarketManager !")
                          exitMenu = True
                      elif choice == "99":
                          print(MarketManager.readtaskmarket())
                      else:
                          print("Invalid Command, Try again !")
          
                  exitMenu = False
          
              elif datastr == "7":
                  print("Bye !")
                  c27While = False
                  #TEST COMMAND
          Je suis débutant en python c'est un peu codé à l'arrache. En gros mon script consiste à récupérer des commandes par un utilisateur et celui permet en parallèle de réaliser des actions.

          -
          Edité par xNir 24 janvier 2015 à 17:52:49

          • Partager sur Facebook
          • Partager sur Twitter
            24 janvier 2015 à 18:05:34

            Peux-tu commenter un peu ton code, car je ne connais quasiment aucun de ces modules, et si je veux pouvoir t'aider il me faut un peu d'aide moi aussi, libre à toi de le faire ou d'attendre des gens plus expérimentés ^^
            • Partager sur Facebook
            • Partager sur Twitter
              24 janvier 2015 à 18:14:53

              Donc, je récapitule j'ai fait ce script pour le jeu travian.fr dans le cas présent il s'agit d'un serveur privé.

              Je te mets en lien ci-contre l'archive complète avec les sources: http://sendbox.fr/pro/mp433keiagvj/c27.rar.html

              La plupart des modules sont des fonctions annexes,

              AttackManager gère principalement une liste dans laquelle se trouve des infos sur une cible

              MarketManager gère une liste qui est parcourue pour pouvoir effectuer les actions.

              PartiesManager gère également une liste qui effectuer également d'autres actions.

              Si tu n'arrives pas à comprendre la logique du programme je peux le commenter encore plus si tu trouves cela nécessaire.

              -
              Edité par xNir 24 janvier 2015 à 18:15:40

              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                24 janvier 2015 à 18:37:41

                Il me semble que mechanize n'est pas threadSafe, il va falloir sans doute gérer la synchronisation manuellement de tes threads.

                • Partager sur Facebook
                • Partager sur Twitter
                  24 janvier 2015 à 18:51:21

                  Je dois synchroniser même en utilisant qu'un seul thread ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    24 janvier 2015 à 19:23:16

                    Je dois synchroniser même en utilisant qu'un seul thread ?

                    what ?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 janvier 2015 à 19:39:27

                      Je voulait dire, est-ce qu'il vraiment nécessaire de synchroniser sachant que mon script n'utilise qu'un seul thread ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        24 janvier 2015 à 19:47:42

                        mon script n'utilise qu'un seul thread

                        Quel intérêt d'un seul thread ? Pourquoi utiliser le module threading ?

                        -
                        Edité par Anonyme 24 janvier 2015 à 19:48:10

                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 janvier 2015 à 20:00:22

                          Ca revient à ce que j'ai dit précédemment, l'utilisateur du script doit pouvoir entrer des commandes dans la console et des autres tâches sont effectués en même temps c'est pour ça que j'ai choisi le module threading. De plus, je n'utilise qu'un seul thread car le site web sur lequel j'utilise ce script n'accepte qu'une seule session.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Problème gestion de mémoire thread

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown