Python Forum
attempted multithread doesn't multithread
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
attempted multithread doesn't multithread
#1
import threading,time

def simple_task(s):
      for j in range(5):
          print(s)
          time.sleep(0.5)

n=5
thread_list=[]

for i in range(n):
     t=threading.Thread(target=simple_task(i))
     t.start()
     thread_list.append(t)
expected result
 0,1,2,3,4,0,1,2....etc
actual
 0,0,0,0,0,1,1,1 etc

I've tried adding t.daemon=True, that doesn't change the result. I seem to be missing something. But haven't a clue what. Anyone know? thx
Reply
#2
Call function like this when using threading.
import threading,time

def simple_task(s):
    for i in range(5):
        print(s)
        time.sleep(0.5)

n = 5
thread_list = []
for i in range(n):
     t = threading.Thread(target=simple_task, args=(i,))
     thread_list.append(t)
     t.start()
Reply
#3
thx. That works. After a a bit of head scratching seems I've got a wrong idea on how python handles function args.
def times(x,y):
return y*x

def apply_func(f,x):
return f(x)

print (apply_func(times,(2,3)))
expected outcome : 6
actual outcome : error, don't like tuple as args for function times

Function parameter ( arg ) lists are written with the syntax of tuples, but they are not tuples. Attempt to pass a tuple as an arg list results in an error. So if the tuple (2,3) is not appropriate here... what is?

my trick to bypass python's arg list ettiquette : always pack arg lists into a tuple. then have your functions take one parameter. 1st line of function is to unpack the tuple
e.g.
def my_funct(my_args):
      x,y,z = my_args
      # function code here
ahahaha, i beat the system

def times(z):
(x,y)=z
return y*x

def apply_func(f,x):
return f(x)

print (apply_func(times,(2,3)))
works here
Reply
#4
Use Ctrl+shift+v when paste in code to preserve indentation.
(Dec-10-2017, 02:56 PM)meems Wrote: ahahaha, i beat the system
Good hack,but there is a normal way to solve this in Python.
Look into *args and **kwargs.
def times(x, y):
    return y * x

def apply_func(f, *args):
    return f(*args)

print(apply_func(times,2,3))
Output:
6

def test(a, b):
    print(a + b)

def apply_func(func, **kwargs):
    for i in range(5):
        func(*tuple(value for _, value in kwargs.items()))

if __name__ == '__main__': 
    apply_func(test, a=2, b=8)
Output:
10 10 10 10 10
Reply
#5
i think mine's better. because it requires less concepts, keeps the language simpler.
I don't understand why the python writers invoked *args and **kwargs when they already had objects like lists.

In the context of this thread, can tuples, lists, *args or **kwargs be used in threading.Thread to get it to multithread properly? Or does python require a 5th 'multi element' type ( the iterator, implicitly defined when by the syntax (x,)
heck, why not create a unique 'multi element' type for each function needing a 'multiple element' input. That's the pythonic way it seems.  Angry
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  How can I multithread to optimize a groupby task: davisc4468 0 715 Jun-30-2023, 02:45 PM
Last Post: davisc4468
  How to measure execution time of a multithread loop spacedog 2 2,907 Apr-24-2021, 07:52 AM
Last Post: spacedog
  Why the multithread does not reduce the execution time? Nicely 2 2,494 Nov-23-2019, 02:28 PM
Last Post: Nicely
  multithread or multicore Chris2018 1 2,200 Oct-11-2018, 06:52 PM
Last Post: Larz60+
  ValueError: Attempted relative import in non-package JoeB 1 11,958 Mar-08-2018, 11:01 AM
Last Post: Gribouillis

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020