您的位置:首页 > 编程语言 > Python开发

详解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
退出主线程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: