Reputation: 559
I am trying to implement multi threading with oops
class test:
def printer(self):
for ctr in range(1000000):
print("hello")
def printHi(self):
for ctr in range(1000000):
print("hi")
if __name__ == "__main__":
test1 = test()
t1 = threading.Thread(target=test1.printHi, args=(10,))
t2 = threading.Thread(target=test1.printer, args=(10,))
t1.start()
t2.start()
print("Done!")
But the test1.printHi is expecting me to pass self
Exception in thread Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3.9/threading.py", line 973, in _bootstrap_inner
Thread-2:
Traceback (most recent call last):
File "/usr/lib/python3.9/threading.py", line 973, in _bootstrap_inner
self.run()
File "/usr/lib/python3.9/threading.py", line 910, in run
self.run()
File "/usr/lib/python3.9/threading.py", line 910, in run
self._target(*self._args, **self._kwargs) self._target(*self._args, **self._kwargs)
TypeError: printHi() takes 1 positional argument but 2 were givenTypeError:
printer() takes 1 positional argument but 2 were given
Done!
After passing self it is not being multi threaded any more It
t1 = threading.Thread(target=test1.printHi())
t2 = threading.Thread(target=test1.printer())
t1.start()
print("next")
t2.start()
Its first printing all hi and then hello at last next is getting printed but when I implement them like functions its working properly they are getting printed at once combined. Whats the right way to implement it properly such that both threads runs simultaneously...
Upvotes: 1
Views: 2048
Reputation: 6930
You seem to be passing an extra 10 to the methods; try:
class test:
def printer(self):
for ctr in range(10):
print("hello")
time.sleep(1)
def printHi(self):
for ctr in range(10):
print("hi")
time.sleep(1)
if __name__ == "__main__":
test1 = test()
t1 = threading.Thread(target=test1.printHi, args=())
t2 = threading.Thread(target=test1.printer, args=())
t1.start()
t2.start()
print("Done!")
Or, if you want to keep the parameter, the functions need to accept it:
class test:
def printer(self, n):
for ctr in range(10):
print("hello", n)
time.sleep(1)
def printHi(self, n):
for ctr in range(10):
print("hi", n)
time.sleep(1)
if __name__ == "__main__":
test1 = test()
t1 = threading.Thread(target=test1.printHi, args=(10,))
t2 = threading.Thread(target=test1.printer, args=(10,))
t1.start()
t2.start()
print("Done!")
Upvotes: 2