详解python多线程的原理和实现
2019-05-27 01:16
816 查看
详解python多线程的原理和实现
线程和进程的区别
#本文部分参考www.runoob.com
问题起因:
在用tkinter开发界面时,如何加一个进度条,显示用户某一操作完成的进度?(这可能是Android开发比较常见的一个功能)
如一个是operate()执行用户操作,一个是precess()维护进度条,这两个任务如何同时进行?
这就需要用到多线程
python线程库
简单介绍:python2是’thread’,为了兼容,python3更名为’_thread’,同时python3还提供了更高级的线程管理库’threading’,推荐使用后者
import threadind
T = threading.Thread( target = xxx, args = (x1, x2, ))
创建一个新线程,target是执行的函数,args是传入的参数
下面展示两个线程运行的情况
import threading, time def print_time(threadName, delay): # 测试函数 count = 0 while count < 5: time.sleep(delay) count += 1 print ("%s: %s" % ( threadName, time.ctime(time.time()) )) # 打印当前时间 #线程t1每执行一次休息2s t1 = threading.Thread( target = print_time, args = ("Thread-1", 2, ) ) #线程t2每执行一次休息4s t2 = threading.Thread( target = print_time, args = ("Thread-2", 4, ) ) #一定要用starth()运行线程 t1.start() t2.start()
运行结果如下:
# 线程1运行 # 线程2运行 Thread-1: Mon May 27 00:28:50 2019 Thread-2: Mon May 27 00:28:52 2019 Thread-1: Mon May 27 00:28:52 2019 Thread-1: Mon May 27 00:28:54 2019 Thread-2: Mon May 27 00:28:56 2019 Thread-1: Mon May 27 00:28:56 2019 Thread-1: Mon May 27 00:28:58 2019 # 线程1结束 Thread-2: Mon May 27 00:29:00 2019 Thread-2: Mon May 27 00:29:04 2019 Thread-2: Mon May 27 00:29:08 2019 # 线程2结束
- 观察上述结果发现,t1和t2线程互不干扰,唯一的影响是t1执行完第一次后sleep了2s才开始执行第1次t2(若没有sleep,理论上应该同时执行不分先后);后面每个线程分别隔2s和 4s执行一次。
创建一个线程类
import threading class myThread (threading.Thread): # 继承theading的__init__方法 def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self): print ("开始线程:" + self.name) # function() print ("退出线程:" + self.name) #下面可以通过myThread()来创建一个新线程
线程同步
如果多个线程同时修改某个数据,可能导致不可预料的后果(如数据库操作中的脏读),这就要求实现一种锁,当线程A执行时,给其他线程添加一个锁以防止某些行为的发生。
lock = threading.Lock()创建锁
lock.acquire()加锁
lock.release()开锁
#!/usr/bin/python3 import threading import time class myThread (threading.Thread): def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self): print ("开启线程: " + self.name) # 获取锁,用于线程同步 threadLock.acquire() print_time(self.name, self.counter, 3) # 释放锁,开启下一个线程 threadLock.release() def print_time(threadName, delay, counter): while counter: time.sleep(delay) print ("%s: %s" % (threadName, time.ctime(time.time()))) counter -= 1 threadLock = threading.Lock() threads = [] # 创建新线程 thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2) # 开启新线程 thread1.start() thread2.start()
结果如下所示:
开启线程: Thread-1 开启线程: Thread-2 Thread-1: Wed Apr 6 11:52:57 2016 Thread-1: Wed Apr 6 11:52:58 2016 Thread-1: Wed Apr 6 11:52:59 2016 Thread-2: Wed Apr 6 11:53:01 2016 Thread-2: Wed Apr 6 11:53:03 2016 Thread-2: Wed Apr 6 11:53:05 2016 退出主线程
相关文章推荐
- Python堆排序原理与实现方法详解
- 排序算法原理详解,结合python实现
- 详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)
- (转)Python-详解抓取网站,模拟登陆,抓取动态网页的原理和实现
- 体会Python之独具匠心:Python XML PRC server多线程实现及其原理
- 详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)
- 体会Python之独具匠心:Python XML PRC server多线程实现及其原理
- Python用threading实现多线程详解
- Python多线程原理与用法详解
- 【详解】Python多线程的实现
- Python封装原理与实现方法详解
- 机器学习之KNN算法原理及Python实现方法详解
- 【转】详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)
- Python实现多线程抓取网页功能实例详解
- [Python]多线程--threading模块实现
- Java第七课 Java的多线程程序进程和线程的概念,实现多线程的两种方式,线程同步的原理,线程的死锁,运用wait和notify来实现producer - consumer关系,线程终止的两种情况。
- Ajax实现原理详解
- 详解python实现FP-TREE进行关联规则挖掘(带有FP树显示功能)附源代码下载(4)
- 射频卡多线程读写原理及其实现
- python 实现多进程和多线程的例子