python threading.Thread多线程还是串行在运行?python多线程target中传参后串行了

本人在python中使用threading.Thread写了多线程之后,发现运行时仍然是串行的,特此整理一下可能遇到的问题及解决方法

一、问题描述/场景复现

问题描述:在python中通过threading.Thread创建了多线程,但是最后执行时发现是串行的。

thread_test.py代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2024-01-27 14:03
 
import threading
import time
 
def run(name):
    time.sleep(3)
    print("Thread: {} is running!\n".format(name))
    time.sleep(3)
 
def parallel_threads_run():
    print("parallel threads running...")
    start = time.time()
    threads_list = []
    for i in range(5):
        t = threading.Thread(target=run("Thread-"+str(i)))
        threads_list.append(t)
        t.start()
    for t in threads_list:
        t.join()
    print("time cost: {}s".format(round(time.time() - start, 2)))
 
if __name__ == "__main__":
    parallel_threads_run()

执行结果:

D:\WorkSpace>python thread_test.py
parallel threads running...
Thread: Thread-0 is running!

Thread: Thread-1 is running!

Thread: Thread-2 is running!

Thread: Thread-3 is running!

Thread: Thread-4 is running!

time cost: 30.05s

二、问题解决

在查询了很多博客及资料后发现是传参的问题,若多线程调用的方法需要传入参数,则需要在args中传入参数,不能直接在target上传入参数。

解决方法如下:

# 正确写法: 若调用方法有单个参数写法如下,注意单个参数时需要有个逗号
t = threading.Thread(target=run, args=("Thread-"+str(i),))

#测试若调用方法需要传入多个参数,调用方法若需要传入多个参数则不需要多写逗号
t = threading.Thread(target=run, args=("Thread-"+str(i),"参数2"))

修改后代码:

# -*- coding: utf-8 -*-
# @Time    : 2024-01-27 14:03
 
import threading
import time
 
def run(name):
    time.sleep(3)
    print("Thread: {} is running!\n".format(name))
    time.sleep(3)
 
def parallel_threads_run():
    print("parallel threads running...")
    start = time.time()
    threads_list = []
    for i in range(5):
        t = threading.Thread(target=run, args=("Thread-"+str(i),))
        threads_list.append(t)
        t.start()
    for t in threads_list:
        t.join()
    print("time cost: {}s".format(round(time.time() - start, 2)))
 
if __name__ == "__main__":
    parallel_threads_run()

执行结果:

D:\WorkSpace>python thread_test.py
parallel threads running...
Thread: Thread-3 is running!
Thread: Thread-4 is running!
Thread: Thread-1 is running!
Thread: Thread-2 is running!
Thread: Thread-0 is running!


time cost: 6.02s

解释一下造成这个现象的原因:

#错误写法:直接在target上传参会导致串行执行
thread1 = threading.Thread(target=run("Thread-"+str(i)))
#正确写法
thread2 = threading.Thread(target=run, args=("Thread-"+str(i),))

其实thread1,thread2核心的区别就是在Thread对象的target对应接收的函数有没有加括号上。

Thread所对应的target参数其实是想要接收一个函数类型的参数,这个时候只写函数名,相当于把函数这个对象传递给了target,这个也叫做函数的回调,为什么叫做“函数回调”呢?因为:
在这里插入图片描述
所以在target所指向的threadfunc函数那里只写函数名,不写括号,相当于是创建了一个子线程,并把threadfunc函数这个变量暂时性赋给了target;并在执行该线程对应的start方法时才会真正调用threadfunc函数。

而在target上传参的话:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值