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,))

进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值