2012-06-06 3 views
0

기본적으로 나는 선택할 수있는 몇 가지 옵션이있는 응용 프로그램을 빌드하고 있습니다.스레드 클래스가있는 모듈을 릴리스하고 파이썬 제어하기

이름이 인 main.py인데 각 모듈을 별도로 실행할 수 있도록 가능한 옵션마다 독립 실행 형 모듈을 작성했습니다. 이제 제가 작성한이 모듈에는 스레드 된 클래스가 들어 있습니다. 내가 명령 할 때 가지고있는 문제 : python mod_keepOnline.py은 터미널에 다시 제어권을 넘겨주지 않는다는 것입니다. 모듈 최저점 main.py을 실행하면 main.py은 새로운 선택을 듣기를 중단합니다. 나는 그것이 실 때문에인지 알아. 나는 그들이 "산란 된 후에 쓰레드가 자신의 것을 관리하게"할 수있는 방법을 궁금해했다. 따라서 mod_keepOnline.py에서 터미널 또는 메인 스크립트로 다시 제어하십시오.

릴리스 된 스레드를 다시 죽일 수 있기를 원합니다.

뭔가 mod_keepOnline.py -killAll처럼

음을 heres 내 코드는 를 :

########################################### 
################## SynBitz.net ############ 
import threading 
import objects 
import time 
import mechanize 
import os 
import gb 
########################################## 
class Class_putOnline (threading.Thread): 
    def __init__ (self,person,onlineTime): 
     threading.Thread.__init__ (self) 
     self.startTime = time.time() 
     self.alive = True 
     self.person = person 
     self.onlineTime = onlineTime 
     self.firstMessage=True 
    def run(self): 
     while(self.alive): 
      if(self.firstMessage): 
       print self.person.getInfo() + " SPAWNED ONLINE" 
       self.firstMessage=False 

      self.person.login() 
      time.sleep(300) 
      self.person.logout() 
      if((time.time()-self.startTime) > self.onlineTime): 
       print self.person.getInfo() + " SPAWNED OFFLINE " 
       self.alive = False 
       self._Thread__stop() 
#########################################    
def main(): 
    for line in open(gb.accFile,"r"): 
     gb.accountList.append(line.rstrip('\n')) 
    for account in gb.accountList: 
     gb.accountInfo = account.split('|',4) 
     browser = mechanize.Browser() 
     browser.set_handle_robots(False) 
     browser.set_handle_redirect(True) 
     browser.set_handle_referer(True) 
     browser.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
     gb.spiderList.append(objects.spider.Bot(gb.accountInfo[0],gb.accountInfo[2],gb.accountInfo[1],gb.accountInfo[3],browser)) 
    if gb.accountInfo[2] not in gb.distros: 
     gb.distros.append(gb.accountInfo[2]) 
    onlineAccounts = [] 
    for index, acc in enumerate(gb.spiderList): 
     onlineAccounts.append(Class_putOnline(acc,115200)) # 600*6*8*4= 28800 = 8 uur 3600 test seconds = 1 h (1200 seconds for test time of 20 minutes... ) 
     time.sleep(0.1) 
     onlineAccounts[index].start() 

if __name__ == "__main__": 
    main() 

내가 백그라운드에서 실행하는 경우에도, 내 서버에 SSH 세션을 열고 파이썬 스크립트를 실행, 내가 후 사망 내 세션을 닫으십시오. 연결되지 않은 상태에서 스크립트를 계속 실행하려면 어떻게해야합니까?

+0

다른 방법으로 프로그램을 실행하지 않고이 문제를 해결할 방법이 없습니다 (가장 좋은 방법은 수동 cronjob이 될 것입니다. 타이슨이 제안했습니다). 아마도 모듈이 무엇을하려고하는지 말할 수 있습니다. –

답변

0

내 서버에 ssh 세션을 열고 파이썬 스크립트를 실행할 때 백그라운드에서 실행할 때도 세션을 닫은 후에 종료됩니다. 연결되지 않은 상태에서 스크립트를 계속 실행하려면 어떻게해야합니까?

cronjob으로 실행하고 필요에 따라 스크립트를 실행해야하는 경우 수동으로 cronjob을 시작하십시오. 너무

나를 파이썬

가 좋아 나는 아주 새로운 해요.

편집 : 빠른 팁, 사용 "" ". 긴 의견

예 :

" ""설명 :

이이 작업을 수행하고 그와 이것 저것을 확장합니다. 이것과 같이 사용하십시오.

"" "

0

나는 이해 :

당신은 프로세스 입력과 출력 리디렉션 후 입력 단자의 출력 프로세스를 실행하면

당신이 스레드이 시작합니다. 이 프로세스는 터미널 in과 output이 둘 다 존재하기 때문에 수행 할 수있는 작업은이 프로그램을 백그라운드 (control-z 포함)로 보내는 것입니다. 자체 네임 스페이스. 가져올 수 있습니다. 모듈 및 속성을 변경하지만 다른 프로그램의 모듈은 변경되지 않습니다.

두 개의 프로그램을 원한다면 하나는 백그라운드에서 모든 타인을 실행하고 (예 : 타이슨이 제안한 작업으로) 하나는 명령 행에서, 두 프로세스간에 통신해야합니다.

어쩌면 프로세스의 경계를 우회하는 다른 방법이있을 수 있지만 그 프로세스를 알지 못합니다.

따라서 값을 저장할 수있는 곳에서이 모듈을 작성했습니다. 값이 직접 저장 될 때마다 모듈의 상태가 디스크에 저장됩니다.

''' 
This is a module with persistent attributes 

the attributes of this module are spread all over all instances of this module 
To set attributes: 
    import runningConfiguration 
    runningConfiguration.x = y 

to get attributes: 
    runningConfiguration.x 

''' 

import os 
import types 
import traceback 

fn = fileName = fileName = os.path.splitext(__file__)[0] + '.conf' 

class RunningConfiguration(types.ModuleType): 

    fileName = fn 

    def __init__(self, *args, **kw): 
     types.ModuleType.__init__(self, *args, **kw) 
     import sys 
     sys.modules[__name__] = self 
     self.load() 

    def save(self): 
     import pickle 
     pickle.dump(self.__dict__, file(self.fileName, 'wb')) 

    def load(self): 
     import pickle 
     try: 
      dict = pickle.load(file(self.fileName, 'rb')) 
     except EOFError: 
      pass 
     except: 
      import traceback 
      traceback.print_exc() 
     else: 
      self.__dict__.update(dict) 

    def __setattr__(self, name, value): 
##  print 'set', name, value, 
     l = [] 
     v1 = self.__dict__.get(name, l) 
     self.__dict__[name] = value 
     try: 
      self.save() 
##   print 'ok' 
     except: 
      if v1 is not l: 
       self.__dict__[name] = v1 
      raise 

    def __getattribute__(self, name): 
     import types 
     if name in ('__dict__', '__class__','save','load','__setattr__',     '__delattr__', 'fileName'): 
      return types.ModuleType.__getattribute__(self, name) 
##  print 'get', name 
     self.load() 
     l = [] 
     ret = self.__dict__.get(name, l) 
     if ret is l: 
      if hasattr(self.__class__, name): 
       return getattr(self.__class__, name) 
      if name in globals(): 
       return globals()[name] 
      raise AttributeError('%s object has no attribute %r' %         (self.__class__.__name__, name)) 
     return ret 

    def __delattr__(self, name): 
     del self.__dict__[name] 
     self.save() 




RunningConfiguration(__name__) 

runningConfiguration.py에 저장했습니다.

이처럼 사용할 수 있습니다

# program1 
import runningConfiguration 
if not hasattr(runningConfiguration, 'programs'): 
    runningConfiguration.programs = [] ## variable programs is set 
runningConfiguration.programs+= ['program1'] ## list is changed and = is used -> module is saved 

이것에 저장할 수 있습니다 모든하지만, 여러 가지 안전하지 않은 모듈이 아니라. 두 모듈이 동시에 저장하면 처음 기록 된 값이 손실 될 수 있습니다.

사용해보기 : 두 개의 다른 프로그램에서 가져 오기를 실행하고 어떻게 동작하는지보십시오.

관련 문제