Python 创建和启动线程

这篇博客介绍了Python中使用`threading.Thread`创建和启动线程的基本方法。通过实例展示了如何传递参数给线程任务,并展示了线程执行的输出。线程的`target`参数用于指定执行的函数,`args`和`kwargs`传递函数参数。博客内容包括创建5个线程,每个线程执行worker函数,参数为i的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建一个线程有以下两种方式。

  • 直接创建一个 Thread 类对象,并给它的构造函数传递一个可调用的对象(callable object)。
  • 从 Thread 类定义一个派生类,并重载其构造函数__init__()和__run__()方法,然后创建一个该派生线程类的对象并传递一个可调用的对象。
    Thread 类的构造函数:
threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

其中,参数 target 就是线程的__run__()方法调用的可调用对象,即线程的执行代码,如果不提供,则线程将什么也不做。参数 name 是这个线程的名字,如果不提供,则系统会提供一个默认的名字。参数 args 和 kwargs 分别是 tuple 和 dict 类型的(可变)参数,即传递给 target 对象的参数。
通过 Thread 类对象的 start()方法可以启动一个线程。Thread 的 start()方法会调用 Thread 的__run__()方法执行构造函数的参数 target 指向的可调用对象,同时将参数 args 和 kwargs 传递给这个target 对象。
下面的代码在主线程中创建了 5 个线程。每个线程的构造函数中接收了一个可调用对象,即函数 worker(args),在该构造函数中,还传递了一个 tuple 对象(i,)作为函数 worker()的参数 args:

#thread_args.py 
import threading 
def worker(args): 
    print('I am a Worker with params %s'%args )
print('This is the main thread!')
threads = [] 
for i in range(5): 
    t = threading.Thread(target=worker,args=(i,))
    threads.append(t)
    t.start()

输出如下:

This is the main thread! 
I am a Worker with params 0 
I am a Worker with params 1 
I am a Worker with params 2 
I am a Worker with params 3 
I am a Worker with params 4 
### 启动线程的方法 在 Python 中,启动线程主要有两种方式。第一种是直接创建 `Thread` 类的对象,并通过传递可调用对象来执行任务。例如: ```python from threading import Thread import time def sayhi(name, input, number): for i in range(1, 10): if number == "线程号1": time.sleep(2) print("这是线程号:%s - %s say hello %s - %s" % (number, name, str(i), input)) else: time.sleep(1) print("线程号:%s - %s say hello %s - %s 休息1秒" % (number, name, str(i), input)) if __name__ == '__main__': for i in range(1, 3): t = Thread(target=sayhi, args=('mike', 'to you', "线程号" + str(i))) t.start() print("主线程结束") ``` 第二种方法是通过继承 `Thread` 类并重载其 `__init__()` `__run__()` 方法来实现。这种方式允许开发者自定义线程的行为。以下是使用继承的方式创建线程的一个例子: ```python from threading import Thread import time class MyThread(Thread): def __init__(self, name, input, number): super().__init__() self.name = name self.input = input self.number = number def run(self): for i in range(1, 10): if self.number == "线程号1": time.sleep(2) print("这是线程号:%s - %s say hello %s - %s" % (self.number, self.name, str(i), self.input)) else: time.sleep(1) print("线程号:%s - %s say hello %s - %s 休息1秒" % (self.number, self.name, str(i), self.input)) if __name__ == '__main__': threads = [] for i in range(1, 3): thread = MyThread('mike', 'to you', "线程号" + str(i)) threads.append(thread) thread.start() for thread in threads: thread.join() print("主线程结束") ``` 这两种方法都可以有效地创建启动线程。选择哪种方法取决于具体的应用场景个人偏好。直接使用 `Thread` 类通常更为简单快捷,而继承 `Thread` 类则提供了更多的灵活性控制能力[^4]。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值