线程

Thread创建线程,Lock互斥锁

from threading import Thread,Lock
xx = Thread(target=函数名)
xx.start() #执行线程

5个线程一起执行

import threading
import time
def saySory():
    print("品爱的,我错了")
    time.sleep(1)
if __name__ == '__main__':
    for i in range(5):
        #创建线程执行
        t = threading.Thread(target=saySory)
        #开始执行
        t.start()

进程里面套线程
进程是资源分配的单位,线程是CPU调度的单位

主线程会等待所有子线程结束才结束

import threading
from time import sleep,ctime

def sing():
    for i in range(3):
        print("正在唱歌...%d"%i)
        sleep(1)
def dance():
    for i in range(3):
        print("正在跳舞...%d"%i)
        sleep(1)
if __name__ == "__main__":
    print('---开始---')
    #主线程会等待所有子线程结束才结束
    t1 = threading.Thread(target = sing)
    t2 = threading.Thread(target = dance)

    t1.start()
    t2.start()
    print("---结束---")

类方法

1个线程执行

#单线程执行
import threading
import time
class MyThread(threading.Thread):
    def run(self):
        for i in range(3):
            time.sleep(1)
            msg = "线程名字:%s,%s"%(self.name,i)
            print(msg)
if __name__ == "__main__":
    t = MyThread()
    t.start()

5个线程执行执行一个方法

import threading
import time

class MyThread(threading.Thread):
    def run(self):
        for i in range(5):
            msg = "线程名字:%s,%s"%(self.name,i)
            print(msg)
def test():
    for i in range(5):
        t = MyThread()
        t.start()
if __name__ == "__main__":
    test()

多进程全局变量不共享
多线程全局变量是共享的

互斥锁
创建锁:mutex = threading.Lock()
锁定:mutex.acquire([blocking])
释放:mutex.release()
其中,锁定发放acquire可以有一个blocking参数

  • 如果设定blocking为True,则当前线程堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True)
  • 如果设定blocking为False,则当前线程不会堵塞

互斥锁代码:

from threading import Thread,Lock
import time

g_num = 0
def work1():
    global g_num
    #这个线程和work2线程都在抢着,如果有一方成功的上锁
    #那么导致另外一方会堵塞(一直等待)到这个锁被解开为止
    #上锁
    mutex.acquire()
    for i in range(1000000):
        g_num += 1
    #执行完上面代码解锁
    mutex.release()
    print("work1:%d"%g_num)
def work2():
    global g_num
    #上锁
    mutex.acquire()
    for i in range(1000000):
        g_num += 1
    #解锁
    mutex.release()
    print("work2:%d"%g_num)
#创建一把互斥锁
mutex = Lock()
if __name__ == "__main__":
    t1 = Thread(target=work1)
    t2 = Thread(target=work2)
    t1.start()
    t2.start()

锁的好处:
确保了某段关键代码只能由一个线程从头到尾完整地执行
锁得坏处:
1.阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了
2.由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.进程和线程 队列:1、进程之间的通信: q = multiprocessing.Queue()2、...
    一只写程序的猿阅读 4,822评论 0 17
  • 转载自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay阅读 11,464评论 1 5
  • 一. 操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式: 向下管理硬件,向上提供接口.操作系统进行...
    月亮是我踢弯得阅读 11,225评论 3 28
  • 线程 操作系统线程理论 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有...
    go以恒阅读 5,627评论 0 6
  • 引用自多线程编程指南应用程序里面多个线程的存在引发了多个执行线程安全访问资源的潜在问题。两个线程同时修改同一资源有...
    Mitchell阅读 6,112评论 1 7

友情链接更多精彩内容