1.无多任务时
完成两个动作需要10秒
import time
def sing():
"""唱歌5秒"""
for i in range(5):
print("---正在唱歌:啦啦啦---")
time.sleep(1)
def dance():
"""跳舞5秒"""
for i in range(5):
print("---正在跳舞---")
time.sleep(1)
def main():
sing()
dance()
if __name__ == '__main__':
main()
2.有多任务时
完成两个动作只需5秒
import time
import threading
def sing():
"""唱歌5秒"""
for i in range(5):
print("---正在唱歌:啦啦啦---")
time.sleep(1)
def dance():
"""跳舞5秒"""
for i in range(5):
print("---正在跳舞---")
time.sleep(1)
def main():
t1 = threading.Thread(target=sing)
t2 = threading.Thread(target=dance)
t1.start()
t2.start()
if __name__ == '__main__':
main()
3.并行与并发
并行:真的多任务(任务数<=cpu)
并发:假的多任务(任务数>cpu)
4.线程
一个程序运行起来后一定有个执行代码的东西,这个东西称之为线程
查看正在运行的主线程,子线程
import threading
import time
def test1():
for i in range(5):
print("---test1---%d" %i)
time.sleep(1)
def test2():
for i in range(5):
print("---test2---%d" %i)
time.sleep(1)
def main():
t1=threading.Thread(target=test1)
t2=threading.Thread(target=test2)
t1.start()
t2.start()
while True:
print(threading.enumerate())
time.sleep(1)
if __name__ == '__main__':
main()
通过继承Thread类完成创建线程
import threading
import time
class MyThreading(threading.Thread):
def run(self):
for i in range(3):
time.sleep(1)
msg = "I'm" + self.name+"@"+str(i) # name属性中保存的是当前线程的名字
print(msg)
if __name__ == '__main__':
t = MyThreading()
t.start()
多线程共享全局变量
import threading
import time
g_num = 100
def test1():
global g_num
g_num += 1
print("----in test1 g_num=%d" % g_num)
def test2():
print("----in test2 g_num=%d" % g_num)
def main():
t1 = threading.Thread(target=test1)
t2 = threading.Thread(target=test2)
t1.start()
time.sleep(1)
t2.start()
time.sleep(1)
print("---in main Thread g_num=%d" % g_num)
if __name__ == '__main__':
main()
如果多线程共享全局变量时出现同时写,则会出现问题!
g_num += 1表示以下三步:
1.获取g_num的值
2.把获取的值+1
3.把第二部的结果存储到g_num中
#在python中执行顺序是一行一行执行,多线程共享全局变量时要“雨露均沾”,有可能只执行到第二步就换了别的子线程执行
- 当参数比较小时出现错误的几率小,有可能不会出现错误:
import threading
import time
g_num = 0
def test1(num):
global g_num
for i in range(num):
g_num += 1
print("----in test1 g_num=%d" % g_num)
def test2(num):
global g_num
for i in range(num):
g_num += 1
print("----in test2 g_num=%d" % g_num)
def main():
t1 = threading.Thread(target=test1,args=(100,))
t2 = threading.Thread(target=test2,args=(100,))
t1.start()
t2.start()
time.sleep(5)
print("---in main Thread g_num=%d" % g_num)
if __name__ == '__main__':
main()
2.当参数为1000000时,会发现结果不是2000000了:
import threading
import time
g_num = 0
def test1(num):
global g_num
for i in range(num):
g_num += 1
print("----in test1 g_num=%d" % g_num)
def test2(num):
global g_num
for i in range(num):
g_num += 1
print("----in test2 g_num=%d" % g_num)
def main():
t1 = threading.Thread(target=test1,args=(1000000,))
t2 = threading.Thread(target=test2,args=(1000000,))
t1.start()
t2.start()
time.sleep(1)
print("---in main Thread g_num=%d" % g_num)
if __name__ == '__main__':
main()
解决方法见下篇