进程与线程python
线程
main()函数中的内容是主线程,在main()中创建的t1和t2是子线程
import time
import threading
def sing():
for i in range(5):
print("正在唱歌。。。。。%d"%i)
time.sleep(1)
def dance():
for i in range(5):
print("。。。。。正在跳舞 %d"%i)
time.sleep(1)
def main():
t1=threading.Thread(target=sing)#这里的sing和dance后面不要写(),否则这叫调用函数,两个线程不会并发执行
t2=threading.Thread(target=dance)
t2.start()
t1.start()
print(threading.enumerate()) #查看线程函数
if __name__=='__main__':
main()
重复创建线程
import time
import threading
def saysorry():
print("亲爱的,我错了")
time.sleep(1)
if __name__ == '__main__':
for i in range(5):
t=threading.Thread(target=saysorry)
t.start()
如果创建Thread时执行的函数运行结束了,那么这个子线程也结束了。
查询当前正在运行的线程的函数threading.enumerate()
import time
import threading
def sing():
for i in range(5):
print("正在唱歌。。。。。%d"%i)
time.sleep(1)
def dance():
for i in range(10):
print("。。。。。正在跳舞 %d"%i)
time.sleep(1)
def main():
#创建子线程
t1=threading.Thread(target=sing)#这里的sing和dance后面不要写(),否则这叫调用函数,两个线程不会并发执行
t2=threading.Thread(target=dance)
t1.start()
time.sleep(1)
t2.start()
while True:
print(threading.enumerate()) #查看线程函数
time.sleep(1)
if __name__=='__main__':
main()
当使用Thread时,不会创建线程;当使用的Thread的start()函数时,才会创建线程并运行。
import time
import threading
def test():
for i in range(5):
print("....test.....%d"%i)
time.sleep(1)
def main():
#调用Thread之前打印当前线程信息
print(threading.enumerate())
t1=threading.Thread(target=test)#这里的sing和dance后面不要写(),否则这叫调用函数,两个线程不会并发执行
# 调用Thread之后打印当前线程信息
print(threading.enumerate())
t1.start()
# 调用start()之后打印当前线程信息
print(threading.enumerate())
if __name__=='__main__':
main()
继承Thread类创建线程
这种情况适用于线程中有很多方法,因此需要用一个类来封装这些方法的情况。如果只有一个函数,可以使用t=threading.Thread(target= )来创建线程。
新建的类中必须有一个函数run(),否则线程不会执行,类中可以定义其它函数方法,但如果想使用这些非run()方法,就必须想办法在run() 函数内部调用它
import time
import threading
class Mythread(threading.Thread):
def run(self):
for i in range(5):
time.sleep(1)
msg="I am"+self.name+" @ "+str(i)
print(msg)
#在run函数中调用类中其他函数的两种方法
self.sing() #Mythread.sing(self)
self.dance() #Mythread.dance(self)
def sing(self):
print("pl")
def dance(self):
print("dance...")
if __name__=='__main__':
t=Mythread()
t.start()
#如果想在线程中执行类中的非run()函数,不可以在t.start()后使用t.sing()和t.dance(),这无异于调用函数。而是应想方设法在run() 函数内部调用这些函数
多线程共享全局变量
不可变类型的变量在函数中应加global,可变性变量不需要
不可变类型有:integer, float, long, complex, string, tuple, frozenset;
可变类型有:list, dictionary, set, numpy.array, user defined objects;
import threading
import time
g=100#定义一个全局变量
#在一个多任务多线程中,子线程和主线程共享一个全局变量
def test1():
global g
g+=1
print("test1...g=%d..."%g)
def test2():
print("test2...g=%d..."%g)
def main():
t1=threading.Thread(target=test1)
t2 = threading.Thread(target=test2)
t1.start()
time.sleep(1) #t1和t2的先后执行顺序未知,如果想让t1先执行,可以让主线哼sleep1秒,1秒时间绝对够用了
t2.start()
time.sleep(1)
print("main...g=%d..."%g)
if __name__=='__main__':
main()
定义线程时传递参数
t1=threading.Thread(target=test1,args=(temp,))