1.线程是最小的进程
2.在python中使用线程需要引入 threading包
3.引入线程最重要的是小心高并发的问题
4.解决高并发的问题可以尝试使用锁的概念
直接上代码:
一.创建线程:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
import time
def job():
time.sleep(1)
print "正在执行任务"
print "当前线程的个数",threading.active_count()
print "当前线程信息",threading.current_thread()
if __name__ == "__main__":
#运行函数
#job()
#创建线程,并执行
t1 = threading.Thread(target = job ,name = "job1" ,args=())
t2 = threading.Thread(target = job ,name = "job221" ,args=())
#开始线程
t1.start()
t2.start()
二.多个线程
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
import time
def readBook(name):
time.sleep(1)
print "马化腾正在读",name
def listenMusic(name):
time.sleep(2)
print "三毛正在听",name
if __name__=="__main__":
t1 = threading.Thread(target = readBook,name = readBook, args=("水浒传",))
t2 = threading.Thread(target = listenMusic,name = listenMusic ,args=("小哪吒",))
t1.start()
t2.start()
# join方法: 在使用多线程时,会等使用该方法的待线程结束之后,再执行其他线程,作用就是阻塞正在调用的其它线程。
t1.join()
t2.join()
print (time.ctime())
三.继承加线程
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
class Job(threading.Thread):
def __init__(self,jobname):
super(Job,self).__init__()
self.jobname = jobname
def run(self):
print "this is Chinese air"
t1 = Job(jobname = "jinwanchisaokao")
t1.start()
四.线程守护
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
import time
def readBook(name):
time.sleep(1)
print "马化腾正在读",name
def listenMusic(name):
time.sleep(2)
print "三毛正在听",name
if __name__=="__main__":
t1 = threading.Thread(target = readBook, args=("水浒传",))
t2 = threading.Thread(target = listenMusic,args=("小哪吒",))
# 将t1线程生命为守护线程, 如果设置为True, 子线程启动, 当主线程执行结束, 子线程也结束
# 设置setDaemon必须在启动线程之前进行设置
#设置一个为false都不行
t1.setDaemon(True)
#t2.setDaemon(True)
t1.start()
t2.start()
#t1.join()
#t2.join()
print (time.ctime())
五.多线程和单线程区别
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
def job(li):
sum(li)
#print li
def use_thread():
li = range(1,10000)
for i in range(5):
t = threading.Thread(target=job, args=(li, ))
t.start()
def use_no_thread():
li = range(1, 10000)
for i in range(5):
job(li)
if __name__ == "__main__":
use_thread()
#use_no_thread()
六.线程锁
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
def add(lock):
# 操作变量之前进行加锁
lock.acquire()
global money
for i in range(10000000):
money +=1
#操作变量完成后进行解锁
lock.release()
def reduce(lock):
lock.acquire()
global money
for i in range(10000000):
money -=1
lock.release()
if __name__=="__main__":
money = 0
#实例化一个锁对象
lock = threading.Lock()
t1 = threading.Thread(target = add ,args = (lock,))
t2 = threading.Thread(target = reduce , args = (lock,))
t1.start()
t2.start()
t1.join()
t2.join()
print 'monet',money
七.线程加队列
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
from queue import Queue
#1.理论上多线程执行任务, 会产生一些数据, 为其他程序执行作铺垫;
#2. 多线程是不能返回任务执行结果的, 因此需要一个容器来存储多线程产生的数据
#3. 这个容器如何选择? list(栈, 队列), tuple(x), set(x), dict(x), 此处选择队列来实现
def job(l,queue):
queue.put(sum(l))
def use_thread():
q = Queue()
threads = []
list1 = [[1, 5, 7, 3, 6, 2], [5, 23, 4, 6], [7, 8, 93, 2], [1, 2, 3, 4]]
for l in list1:
t = threading.Thread(target = job , args=(l,q))
threads.append(t)
t.start
[thread.join() for thread in threads]
#从队列中拿出所有的运行结果
result = [q.get for _ in range(len(list1))]
print result
if __name__ == "__main__":
use_thread()