多线程(?):循环中的手动干扰

时间:2013-10-14 07:57:45

标签: python multithreading

我一直在寻找一种直接更改正在运行的模块中的变量的方法。 我想要实现的是正在运行负载测试,我可以手动调整呼叫速度或者无论如何。

下面我刚创建的一些代码(未经测试的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(): - )

2 个答案:

答案 0 :(得分:0)

您编写的伪代码与线程/多处理在python中的工作方式非常相似。您将需要启动一个“永远运行”的(例如)线程,然后不是直接修改内部速率值,您可能只是通过提供新值的队列发送消息。

查看this question

以下是您所做的事情的演示。我更喜欢使用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()