Python(二): 多线程
一、Python 创建线程方法
1. 新建Thread类
直接通过Threading.Thread来创建
from threading import Thread
def func(num):
print(num)
t = Thread(target=func,args=(1,))
t.start()
通过继承Thread类
from threading import Thread
class MyThread(Thread,name):
def __init__(self,arg1)
super().__init__()
self.arg1 = arg1
def run(self):
print(self.arg1)
t = MyThread(1)
t.start()
二、多线程问题
我想实现在主线程的循环里修改设备号(device_num),然后在线程里不断对新设备号发送指令,之前的写法有点sb:
def findDevice(device_num):
pass
# 主线程
for device_num in range(1,9):
# 循环发送信号
thread1 = threading.Thread(target=send)
thread1.setDaemon(True)
thread1.start()
time.sleep(5) #延时
print("当前线程数:"+str(threading.active_count()))
print("所有线程"+str(threading.enumerate()))
这里我看线程一直增加,之前天真的以为thread1重新赋值会结束掉之前的线程对象,结果其实是新增加了一个线程对象,把thread1指向新的对象,原来的对象肯定还在,只是不知道叫啥了。然后我又想把device_num直接改成全局变量,这样线程里的device_num就可以自动更新了,结果改成这个熊样:
device_num=1 #全局变量
def findDevice(device_num):
pass
# 循环发送信号
thread1 = threading.Thread(target=findDevice,args=(device_num,))
thread1.setDaemon(True)
thread1.start()
# 主线程
for device_num in range(1,9):
time.sleep(5) #延时
print("当前线程数:"+str(threading.active_count()))
print("所有线程"+str(threading.enumerate()))
当线程启动时,相当于把device_num的值引用传进来了,之后Thread1线程里的device_num都是1了。
正确做法1:
引用传递
device_num=[1]
def findDevice(device_num):
while(True):
print(device_num[0])
time.sleep(0.5)
## 循环发送信号
thread1 = threading.Thread(target=findDevice,args=(device_num,))
thread1.setDaemon(True)
thread1.start()
####################### 得改 #####################
for i in range(9,1,-1):
device_num[0]=i
print("当前线程数:"+str(threading.active_count()))
print("所有线程"+str(threading.enumerate()))
time.sleep(3)
正确做法2:
直接把Thread1线程调用的函数里的device_num设置成全局变量
device_num=1
def findDevice():
global device_num
while(True):
print(device_num)
time.sleep(0.5)
## 循环发送信号
thread1 = threading.Thread(target=findDevice)
thread1.setDaemon(True)
thread1.start()
####################### 得改 #####################
for device_num in range(9,1,-1):
print("当前线程数:"+str(threading.active_count()))
print("所有线程"+str(threading.enumerate()))
time.sleep(3)
唉,啥时候了还犯这种低级错误……