区块链技术博客
www.b2bchain.cn

python-初识多任务线程

这篇文章主要介绍了python-初识多任务线程的讲解,通过具体代码实例进行19284 讲解,并且分析了python-初识多任务线程的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=19284

本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:

python-初识多任务线程

  • 1.多任务基本介绍
    • 1.1 程序中模拟多任务
  • 2. 主线程和子线程的执行关系
  • 3. 查看线程数量
  • 4. 验证子线程的执行与创建
  • 5. 线程间的通信(多线程共享全局变量)
    • 5.1 多线程参数-args
  • 6. 制作一个摸奖转盘

1.多任务基本介绍

有很多的场景中的事情是同时进行的,比如开车的时候手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的

1.1 程序中模拟多任务

1 import time 2 3 def sing(): 4 for i in range(3): 5 print("正在唱歌...%d"%i) 6 time.sleep(1) 7 8 def dance(): 9 for i in range(3): 10 print("正在跳舞...%d"%i) 11 time.sleep(1) 12 13 if __name__ == '__main__': 14 sing() 15 dance() 

2. 主线程和子线程的执行关系

主线程会等待子线程结束之后在结束

import threading import time  def demo():     for i in range(5):         print('hello world')         time.sleep(1)   if __name__ == '__main__':      t = threading.Thread(target=demo)     t.start() # 启动线程 主线程会等待子线程结束之后 主线程在结束     print(1) # 输出 hello world 1 hello world hello world hello world hello world   

join() 等待子线程结束之后,主线程继续执行

import threading import time  def demo():     for i in range(5):         print('hello world')         time.sleep(1)  if __name__ == '__main__':      t = threading.Thread(target=demo)     t.start() # 启动线程 主线程会等待子线程结束之后 主线程在结束     t.join() # 等待子线程结束之后,主线程继续执行     print(1) # 输出 hello world hello world hello world hello world hello world 1 

setDaemon() 守护线程,不会等待子线程结束

import threading import time  def demo():     for i in range(5):         print('hello world')         time.sleep(1)  if __name__ == '__main__':      t = threading.Thread(target=demo)     t.setDaemon(True) # 守护线程 不会等待子线程结束     t.start()      print(1) # 输出 hello world 1  

实例1

import threading import time def singe():      for i in range(3):          print('正在唱歌....')         time.sleep(1)   def dance():     for i in range(3):         print('正在跳舞....')         time.sleep(1)  def main():      t1 = threading.Thread(target=singe)     t2 = threading.Thread(target=dance)      t1.start()     t2.start() if __name__ == '__main__':     main()  # 输出 正在唱歌.... 正在跳舞.... 正在唱歌.... 正在跳舞.... 正在唱歌.... 正在跳舞.... 

实例2

1 import threading 2 import time 3  4 def demo(): 5 # 子线程 6 print("hello girls") 7 time.sleep(1) 8 9 if __name__ == "__main__": 10 for i in range(5): 11 t = threading.Thread(target=demo) 12 t.start() 

3. 查看线程数量

1 threading.enumerate() 查看当前线程的数量 
import threading  import time def demo1():      for i in range(5):          print('demo1--%d'%i)         time.sleep(1)   def demo2():      for i in range(10):         print('demo2--%d' % i)         time.sleep(1)   def main():      t1 = threading.Thread(target=demo1,name = 'demo1')     t2 = threading.Thread(target=demo2,name = 'demo2')      t1.start()     t2.start()      while True:           print(threading.enumerate())          if len(threading.enumerate()) <= 1:             break          time.sleep(1)  if __name__ == '__main__':      main() 

4. 验证子线程的执行与创建

当调用Thread的时候,不会创建线程。当调用Thread创建出来的实例对象的start方法的时候,才会创建线程以及开始运行这个线程。

继承Thread类创建线程

import threading  import time  class Main(threading.Thread):      def run(self):          for i in range(5):              print(i)   if __name__ == '__main__':      m = Main()     m.start() 
1 import threading 2 import time 3  4 class A(threading.Thread): 5  6 	def __init__(self,name): 7 		super().__init__(name=name) 8  9 	def run(self): 10 		for i in range(5): 11 			print(i) 12 13 if __name__ == "__main__": 14 t = A('test_name') 15 t.start() 

5. 线程间的通信(多线程共享全局变量)

在一个函数中,对全局变量进行修改的时候,是否要加global要看是否对全局变量的指向进行了修改,如果修改了指向,那么必须使用global,仅仅是修改了指向的空间中的数据,此时不用必须使用global线程是共享全局变量

import threading import time  # 线程间是共享的全局变量 num = 100 def demo1():     global num     num += 1     print('demo1--%d'% num)  def demo2():     print('demo2--%d' % num)  def main():      t1 = threading.Thread(target = demo1)     t2 = threading.Thread(target = demo2)      t1.start()     time.sleep(1) # 保证demo1先执行     t2.start()      print('main-num=%s'% str(num))  if __name__ == '__main__':      main()  

5.1 多线程参数-args

1 threading.Thread(target=test, args=(num,)) 
import threading import time  num = [11,22]  def demo1(nums):      num.append(nums)     print('demo1--%s'% str(num))  def demo2():      print('demo2--%s' % str(num))   def main():      t1 = threading.Thread(target = demo1,args=(33,))     t2 = threading.Thread(target = demo2)      t1.start()     time.sleep(1) # 保证demo1先执行     t2.start()     print('main-num=%s'% str(num))  if __name__ == '__main__':      main()  

6. 制作一个摸奖转盘

# 1.有12个备选选项和2个功能按钮 确定备选选项和功能按钮的位置  # 2.点击开始会不断旋转。选中的时候背景颜色为红色,点击停止结束  import threading  import tkinter  import time  # 1.实现窗口  root = tkinter.Tk()  root.title('抽奖,试试手气')  root.minsize(300,300)  # 2 摆放按钮 btn1 = tkinter.Button(root, text='1元', bg='red') btn1.place(x=20, y=20, width=50, height=50)  btn2 = tkinter.Button(root, text='50元', bg='white') btn2.place(x=90, y=20, width=50, height=50)  btn3 = tkinter.Button(root, text='100元', bg='white') btn3.place(x=160, y=20, width=50, height=50)  btn4 = tkinter.Button(root, text='1万', bg='white') btn4.place(x=230, y=20, width=50, height=50)  btn5 = tkinter.Button(root, text='单车', bg='white') btn5.place(x=230, y=90, width=50, height=50)  btn6 = tkinter.Button(root, text='摩托', bg='white') btn6.place(x=230, y=160, width=50, height=50)  btn7 = tkinter.Button(root, text='汽车', bg='white') btn7.place(x=230, y=230, width=50, height=50)  btn8 = tkinter.Button(root, text='法拉利', bg='white') btn8.place(x=160, y=230, width=50, height=50)  btn9 = tkinter.Button(root, text='宾利', bg='white') btn9.place(x=90, y=230, width=50, height=50)  btn10 = tkinter.Button(root, text='直升机', bg='white') btn10.place(x=20, y=230, width=50, height=50)  btn11 = tkinter.Button(root, text='别墅', bg='white') btn11.place(x=20, y=160, width=50, height=50)  btn12 = tkinter.Button(root, text='航母', bg='white') btn12.place(x=20, y=90, width=50, height=50)  #2.1将所有的选项放到列表中 目的:为了操作这些选项 hero_list = [btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn10,btn11,btn12]   # 定义一个标记 stop_sign = False # 默认是停止  stop_id = None  # 3 定义一个函数 1.循环备选选项 2.设置选项颜色 def round():      global stop_id      i = 1      if isinstance(stop_id,int):          i = stop_id      while True:          time.sleep(0.3)           for x in hero_list:              x['bg'] = 'white'           hero_list[i]['bg'] = 'red'           i += 1          print('当前的i为:',i)          if i >= len(hero_list):              i = 0          if stop_sign == True:              stop_id = i              break  # 4 定义停止的方法 def stop():      global stop_sign      if stop_sign == True:          return      stop_sign = True     # 5 定义开始的方法  def newtask():      global stop_sign      stop_sign = False       t = threading.Thread(target=round)       t.start()  # 6.设置按钮 btn_start = tkinter.Button(root,text='开始',command=newtask)  btn_start.place(x=90,y=125,width=50,height=50)   btn_stop = tkinter.Button(root,text='停止',command=stop)  btn_stop.place(x=160,y=125,width=50,height=50)   # 显示窗口 root.mainloop()  

运行后效果
python-初识多任务线程

本文转自互联网,侵权联系删除python-初识多任务线程

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » python-初识多任务线程
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们