Python从一个线程到另一个多线程覆盖变量

时间:2014-03-24 19:53:26

标签: python multithreading

如何在这个多线程Szenario中将_While.py中的变量赋予__scheduler.py? 我尝试了很多东西,但似乎没有任何工作。

Thread.py

from multiprocessing import Process
import _While
import _Scheduler

if __name__ == '__main__':
    p1 = Process(target=_While.main)
    p1.start()
    p2 = Process(target=_Scheduler.main)
    p2.start()

_While.py

import time
def main():

    while True:
        print "while"
        time.sleep(0.5)
        """getting button status"""
        """giving button status to _Scheudler._scheduler"""

__ Scheduler.py

import logging
import time
from apscheduler.scheduler import Scheduler
from _While import """button status"""

def _scheduler():
    print "scheduler"

    while """button status"""==True:
        print "Button is pressed"
        time.sleep(0.5)


def main():
    logging.basicConfig()
    scheduler = Scheduler(standalone=True)
    scheduler.add_interval_job(_scheduler, seconds=2)
    scheduler.start()

if __name__ == '__main__':
    main()

解决方案:

Thread.py

from multiprocessing import Process, Value, Array
import time
import _While
import _Scheduler

if __name__ == '__main__':

    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p1 = Process(target=_While.main, args=(num, arr))
    p1.start()
    p2 = Process(target=_Scheduler.main, args=(num, arr))
    p2.start()
    p1.join()
    p2.join()

    print num.value

_While

import time
def main(num, arr):
    while True:
        print "while"
        num.value = 1
        time.sleep(10)
        """getting button status"""
        """giving button status to _Scheudler._scheduler"""

__ Scheduler.py

import logging
from apscheduler.scheduler import Scheduler

def _scheduler(num, arr):
    while True:
        print num.value
        if num.value == 1:
            print "mongo"
            num.value = 0
            break

def main(num, arr):
    logging.basicConfig()
    scheduler = Scheduler(standalone=True)
    scheduler.add_interval_job(_scheduler, args=(num, arr), seconds=2)
    scheduler.start()

if __name__ == '__main__':
    main()

唯一的问题是我不能使用Value而不使用Array

1 个答案:

答案 0 :(得分:2)

在创建p1和p2之前在Threads.py中创建multiprocessing.Value的实例,然后将Value的实例作为args传递给p1和p2,并更改_While.py和_Scheduler.py的main()方法接受新的Value参数。

与此处的方式类似http://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes

你也可以按照Euegene C的建议使用队列或管道。可以在这里找到一个例子http://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes