Python(二): 多线程

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)

唉,啥时候了还犯这种低级错误……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值