python进程与线程
线程的注意事项
1、线程之间执行是无序的
import threading
import time
def task():
print(threading.current_thread().name)
time.sleep(0.5)
if __name__ == '__main__':
# 循环创建多个线程
for i in range(10):
sub_thread = threading.Thread(target=task)
sub_thread.start()
Thread-1
Thread-2
Thread-3
Thread-4
Thread-5
Thread-6
Thread-8
Thread-9
Thread-7
Thread-10
2、主线程会等待所有的子线程执行结束再结束
import threading
import time
def task():
for i in range(10):
print('任务中-----')
time.sleep(0.2)
if __name__ == '__main__':
sub_thread = threading.Thread(target=task)
sub_thread.start()
time.sleep(1)
print('主线程')
任务中-----
任务中-----
任务中-----
任务中-----
任务中-----
主线程
任务中-----
任务中-----
任务中-----
任务中-----
任务中-----
我们可以设置子线程守护主线程,主线程退出,子线程直接销毁。
有两种方法:详情看下方代码
import threading
import time
def task():
for i in range(10):
print('任务中-----')
time.sleep(0.2)
if __name__ == '__main__':
# 方式一:daemon=True
# sub_thread = threading.Thread(target=task, daemon=True)
# sub_thread.start()
# 方式二:
sub_thread = threading.Thread(target=task)
sub_thread.setDaemon(True)
sub_thread.start()
time.sleep(1)
print('主线程')
任务中-----
任务中-----
任务中-----
任务中-----
任务中-----
主线程
3、线程之间共享全局变量
import threading
import time
g_list = []
def add_data():
for i in range(3):
# 将i追加到全局变量内
g_list.append(i)
time.sleep(0.2)
print(g_list)
def read_data():
print('read_data:', g_list)
if __name__ == '__main__':
# 创建添加数据的子线程
add_thread = threading.Thread(target=add_data)
# 创建读取数据的子线程
read_thread = threading.Thread(target=read_data)
add_thread.start()
# 让当前线程(主线程)等待添加数据的线程执行完成后代码在继续执行
add_thread.join()
read_thread.start()
先导入线程模块,创建两个子线程
[0, 1, 2]
read_data: [0, 1, 2]
这点线程与进程不同,进程之间不共享全局变量。
4、线程之间共享全局变量数据出现错误问题。
线程在共享全局变量时,数据会出现出错的问题
import threading
# 定义一个全局变量
g_num = 0
def first_data():
for i in range(1000000):
# 声明全局变量
global g_num
g_num += 1
print('第一个:', g_num)
def second_data():
for i in range(1000000):
# 声明全局变量
global g_num
g_num += 1
print('第二个:', g_num)
if __name__ == '__main__':
# 创建第一个子线程
first_thread = threading.Thread(target=first_data)
# 创建第二个子线程
second_thread = threading.Thread(target=second_data)
first_thread.start()
# 让当前线程(主线程)等待添加数据的线程执行完成后代码在继续执行
# first_thread.join() # 若没有这一步数据出错 例: "第二个: 1145315; 第一个: 1204873"
second_thread.start()
如有错误请斧正!!!
全局变量数据出错有两种解决办法。详情点击链接: https://blog.csdn.net/xbc3970/article/details/115268459。