基本上我正在构建一个具有几个编号选项的应用程序供您选择。
它名为 main.py ,我为每个可能的选项编写了独立模块,因此我可以单独运行模块。现在我写的这个模块包含一个线程类。我在命令时遇到的问题:python mod_keepOnline.py
是它没有将控制权传递回终端| AND |当我通过 main.py 运行模块时, main.py 会停止侦听要选择的新选项。我知道这是因为线程。我想知道如何“让线程在产生后管理自己”。因此,请从mod_keepOnline.py
返回到终端或主脚本的控制权。
我也希望能够再次杀死已发布的线程。
类似于mod_keepOnline.py -killAll
嗯,这是我的代码:
###########################################
################## 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会话到我的服务器并运行python脚本时,即使我在后台运行它,它也会在我关闭会话后死掉。当我没有连接时,如何保持脚本运行?
答案 0 :(得分:0)
当我打开ssh会话到我的服务器并运行python脚本时,即使我在后台运行它,它也会在我关闭会话后死掉。如果我没有连接,我如何保持脚本运行?
将其作为cronjob运行,如果需要按需运行脚本,请手动启动cronjob。
好的我对python
很新
我也是。
编辑: 快速提示,请使用“”作长篇评论。
示例:
“”“说明:
这样做,并且扩展了这个和那个。像这样和那样使用它。
“”“
答案 1 :(得分:0)
据我了解:
当您运行流程时,终端的输入和输出将重定向到流程输入和输出。
如果启动线程,这不会改变任何内容。该过程具有终端输入和输出两者都存在。你可以做的是将这个程序发送到后台(使用control-z)。
如果您运行程序,它有自己的命名空间。您可以导入模块并更改它的属性,但这永远不会更改另一个程序中的模块。
如果你想拥有两个程序,一个是在后台运行所有的tine(例如,使用Tyson提出的作业)和一个来自命令行,你需要在这两个进程之间进行通信。
也许有其他方法来绕过过程的边界,但我不知道它们。
因此我写了这个模块,我可以在其中存储值。每次直接存储一个值,模块的状态就会保存到磁盘。
'''
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
这是一个不安全的模块,并不是所有东西都可以保存到它,但很多东西。 此外,当两个模块同时保存时,第一个写入的值可能会丢失。
尝试一下:从两个不同的程序导入ist并查看它的行为方式。