python的多线程原来可以这样解

作者:lijin111222 时间:2021-02-22 16:12:18 

多线程

多线程类似于同时执行多个不同程序,多线程运行有如下优点:

使用线程可以把占据长时间的程序中的任务放到后台去处理。
用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
程序的运行速度可能加快。
在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

创建线程

一个进程里面必然有一个主线程。

创建线程的两种方法
继承Thread类,并重写它的run()方法
import threading
import time
cLass MyThread(threading.Thread):
def__ init__ (seLf, n):
super (MyThread, seLf).__ init__()
self.n = n
def run(self):
print('以类的方式创建多线程',self.n)
time.sleep(3)
r1 = MyThread(1)
r2 = MyThread(2)
r1.start()
r2.start()
调用threading库的Thread类
import threading
import time
def test(x):
   print(x)
   time.sleep(2)
if __name__=='__main__':
   t1 = threading.Thread(target=test, args=(1,))  
   t2 = threading.Thread(target=test, args=(2,))
   t1.start()
   t2.start()

守护线程此类线程的特点是,当程序中主线程及所有非守护线程执行结束时,未执行完毕的守护线程也会随之消亡(进行死亡状态),程序将结束运行。

#守护线程
import threading
import time
def run(n):
   print('task',n)
   time.sleep(1)
   print('3s')
   time.sleep(1)
   print('2s')
   time.sleep(1)
   print('1s')
if __name__ == '__main__': #主线程
   t=threading.Thread(target=run,args=('t1',))
   t.setDaemon(True) #设置子线程为守护线程,守护主线程。主线程结束,子线程也立马结束。必须在start() 方法调用之前设置
   t.start()
   print('end')

线程锁

1.互斥锁

#互斥锁
import threading
def run():
   global x
   lock.acquire() #申请锁
   x+=1
   lock.release() #释放锁
if __name__=='__main__':
   x=0
   res=[]
   lock=threading.Lock() #实例化线程锁
   for i in range(100): #100个线程
       t=threading.Thread(target=run)
       t.start()
       res.append(t)
   for t in res:
       t.join()    
   print(x)
2.递归锁

import threading
def func(lock):
   global gl_num
   lock.acquire()
   gl_num += 1
   time.sleep(1)
   print(gl_num)
   lock.release()
if __name__ == '__main__':
   gl_num = 0
   lock = threading.RLock()
   for i in range(10):
      t = threading.Thread(target=func,args=(lock,))
      t.start()

练手:

import threading
import time  #导入时间模块

#线程一:输出当前的年月日时分秒
class myThread1(threading.Thread):
   def run(self):
       while (True):
           print(time.asctime(time.localtime(time.time())))#输出实时时间
           time.sleep(1)
#线程二:name每2秒打印输出4次结束
class myThread2(threading.Thread):#继承threading.Thread
   def __init__(self,name):#继承父类的方法实现继承threading.Thread      
       super(myThread2, self).__init__()#super方法调用父类
       self.name=name #实例化对象属性    
   def run(self):#重写Thread类中的run方法
       for i in range(4):#for循环打印4次
           print(self.name)          
           time.sleep(2)#打印一次delay两秒
if __name__ == '__main__':
   #创建线程1和线程2并传入参数
   x1 = myThread1()
   x2 = myThread2("张三")
   #开启线程
   x1.start()
   x2.start()

来源:https://blog.csdn.net/lijin111222/article/details/122388381

标签:python,线程,多线程
0
投稿

猜你喜欢

  • 实例简析XPath串函数和XSLT

    2008-09-04 14:16:00
  • 如何使用python把ppt转换成pdf

    2022-09-20 14:27:14
  • 使用python实现个性化词云的方法

    2021-08-27 03:46:59
  • 资料:MsSQL常用SQL语句

    2009-02-23 12:54:00
  • python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)

    2022-09-09 12:52:45
  • 下拉列表两级连动的新方法(一)

    2009-06-04 18:18:00
  • [译]艺术和设计的差异 (2)

    2009-10-15 12:36:00
  • asp修改文件和文件夹的名字的代码

    2011-04-11 11:04:00
  • python random从集合中随机选择元素的方法

    2023-07-05 08:29:45
  • Ext2.0.2经典的一个JS组件(带EXT中文手册)

    2009-04-13 12:24:00
  • MySQL数据库生产环境的维护工作总结的经验

    2011-12-01 10:20:52
  • Python类属性的延迟计算

    2023-07-22 15:50:33
  • 探索Python数据可视化库中Plotly Express的使用方法

    2022-10-29 13:45:31
  • 网站重构到底是什么

    2008-11-03 11:30:00
  • [译]“我心中的ebay”

    2008-06-04 12:09:00
  • 巧用Dreamweaver4文件库更新网站

    2007-02-03 11:31:00
  • 4行Python代码生成图像验证码(2种)

    2021-02-08 06:08:03
  • Python实现生活常识解答机器人

    2021-06-22 14:34:36
  • 960 Grid System 基本原理及使用方法

    2009-02-28 13:35:00
  • 从pandas一个单元格的字符串中提取字符串方式

    2022-10-14 21:24:35
  • asp之家 网络编程 m.aspxhome.com