thread类
# 签名
1 |
|
- target: 线程调用的对象,就是目标函数.
- name: 为线程起个名字.
- args: 为目标函数传递实参, 元组.
- kwargs: 为目标函数关键字传参, 字典.
线程启动
import threading
- 通过threading.Thread创建一个线程对象,target是目标函数,name可以指定名称.
- 但是线程没有启动,需要调用start方法.
- 线程会执行函数,是因为线程中就是执行代码的,而最简单的封装就是函数,所以还是函数调用.
- 函数执行完,线程也会随之退出.
def worker():
print("I'm working")
print("Finished")
t = threading.Thread(target=worker, name='worker') # 线程对象.
t.start()
如果不让线程退出,或者让线程一直工作: 函数内部使用while循环.
import threading
import time
def worker():
while True:
time.sleep(1)
print("I'm work")
print('Finished')
t = threading.Thread(target=worker, name='worker') # 线程对象.
t.start() # 启动.
线程退出
python没有提供线程退出的方法,在下面情况时会退出:
- 线程函数内语句执行完毕.
- 线程函数中抛出未处理的异常.
import threading
import time
def worker():
count = 0
while True:
if (count > 5):
raise RuntimeError()
# return
time.sleep(1)
print("I'm working")
count += 1
t = threading.Thread(target=worker, name='worker') # 线程对象.
t.start() # 启动.
print("==End==")
python的线程没有优先级,没有线程组的概念,也不能被销毁、停止、挂起,自然也没有恢复、中断.
线程的传参
import threading
import time
def add(x, y):
print('{} + {} = {}'.format(x, y, x + y, threading.current_thread()))
thread1 = threading.Thread(target=add, name='add', args=(4, 5)) # 线程对象.
thread1.start() # 启动.
time.sleep(2)
thread2 = threading.Thread(target=add, name='add',args=(5, ), kwargs={'y': 4}) # 线程对象.
thread2.start() # 启动.
time.sleep(2)
thread3 = threading.Thread(target=add, name='add', kwargs={'x': 4, 'y': 5}) # 线程对象.
thread3.start() # 启动.
线程传参和函数传参没什么区别,本质上就是函数传参.
threading的属性和方法
current_thread() # 返回当前线程对象.
main_thread() # 返回主线程对象.
active_count() # 当前处于alive状态的线程个数.
enumerate() # 返回所有活着的线程的列表,不包括已经终止的线程和未开始的线程.
get_ident() # 返回当前线程ID,非0整数.