Lennard
Lennard

Reputation: 35

Python overgiving variable from one thread to the other multithreading

How to give a variable from _While.py to __scheduler.py in this multithreading Szenario? I tried so much stuff but nothing seems to be working.

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()

Solution:

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()

The only problem left is that I can't use Value without using Array

Upvotes: 2

Views: 75

Answers (1)

Medhat Gayed
Medhat Gayed

Reputation: 2813

Create an instance of multiprocessing.Value in Threads.py just before you create p1 and p2, then pass the instance of Value as args to both p1 and p2 and change the main() method of _While.py and _Scheduler.py to accept the new Value parameter.

Similar to how it is done here http://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes

You could also use Queues or Pipes as suggested by Euegene C. an example can be found here http://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes

Upvotes: 2

Related Questions