我一直在寻找一种直接更改正在运行的模块中的变量的方法。 我想要实现的是正在运行负载测试,我可以手动调整呼叫速度或者无论如何。
下面我刚创建的一些代码(未经测试的e.d.),只是为了给你一个想法。
class A():
def __init__(self):
self.value = 1
def runForever(self):
while(1):
print self.value
def setValue(self, value):
self.value = value
if __name__ == '__main__':
#Some code to create the A object and directly apply the value from an human's input
a = A()
#Some parallelism or something has to be applied.
a.runForever()
a.setValue(raw_input("New value: "))
编辑#1:是的,我知道现在我永远不会点击a.setValue(): - )
答案 0 :(得分:0)
您编写的伪代码与线程/多处理在python中的工作方式非常相似。您将需要启动一个“永远运行”的(例如)线程,然后不是直接修改内部速率值,您可能只是通过提供新值的队列发送消息。
以下是您所做的事情的演示。我更喜欢使用Queues直接调用线程/进程。
import Queue # !!warning. if you use multiprocessing, use multiprocessing.Queue
import threading
import time
def main():
q = Queue.Queue()
tester = Tester(q)
tester.start()
while True:
user_input = raw_input("New period in seconds or (q)uit: ")
if user_input.lower() == 'q':
break
try:
new_speed = float(user_input)
except ValueError:
new_speed = None # ignore junk
if new_speed is not None:
q.put(new_speed)
q.put(Tester.STOP_TOKEN)
class Tester(threading.Thread):
STOP_TOKEN = '<<stop>>'
def __init__(self, q):
threading.Thread.__init__(self)
self.q = q
self.speed = 1
def run(self):
while True:
# get from the queue
try:
item = self.q.get(block=False) # don't hang
except Queue.Empty:
item = None # do nothing
if item:
# stop when requested
if item == self.STOP_TOKEN:
break # stop this thread loop
# otherwise check for a new speed
try:
self.speed = float(item)
except ValueError:
pass # whatever you like with unknown input
# do your thing
self.main_code()
def main_code(self):
time.sleep(self.speed) # or whatever you want to do
if __name__ == '__main__':
main()
答案 1 :(得分:0)
这是一个多线程示例。此代码将与python解释器一起使用,但不能与IDLE的Python Shell一起使用,因为raw_input
函数的处理方式不同。
from threading import Thread
from time import sleep
class A(Thread):
def __init__(self):
Thread.__init__(self)
self.value = 1
self.stop_flag = False
def run(self):
while not self.stop_flag:
sleep(1)
print(self.value)
def set_value(self, value):
self.value = value
def stop(self):
self.stop_flag = True
if __name__ == '__main__':
a = A()
a.start()
try:
while 1:
r = raw_input()
a.set_value(int(r))
except:
a.stop()