Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: what is the proper way to pass arguments to threading.Thread instance

I have extended threading.Thread - my idea is to do something like this:

class StateManager(threading.Thread):
    def run(self, lock, state):
        while True:
            lock.acquire()
            self.updateState(state)
            lock.release()
            time.sleep(60)

I need to be able to pass reference to my "state" object and eventually to a lock (I'm quite new to multi-threading and still confused about the necessity of locking in Python). What is the proper way to do it?

like image 599
ddinchev Avatar asked Dec 04 '22 19:12

ddinchev


2 Answers

pass them in the constructor, e.g.

class StateManager(threading.Thread):
    def __init__(self, lock, state):
        threading.Thread.__init__(self)
        self.lock = lock
        self.state = state            

    def run(self):
        lock = self.lock
        state = self.state
        while True:
            lock.acquire()
            self.updateState(state)
            lock.release()
            time.sleep(60)
like image 63
lidaobing Avatar answered Dec 07 '22 23:12

lidaobing


I'd say that it's easier to keep the threading part away from the StateManager object:

import threading
import time

class StateManager(object):
    def __init__(self, lock, state):
        self.lock = lock
        self.state = state

    def run(self):
        lock = self.lock
        state = self.state
        while True:
            with lock:
                self.updateState(state)
                time.sleep(60)

lock = threading.Lock()
state = {}
manager = StateManager(lock, state)
thread = threading.Thread(target=manager.run)
thread.start()
like image 27
jcollado Avatar answered Dec 08 '22 01:12

jcollado