python3之线程

Posted 漏斗倒过来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3之线程相关的知识,希望对你有一定的参考价值。

1线程的创建:

import threading
import time,random


def text1():
    while True:
        print(1111111)
        time.sleep(random.random()*2)

def text2():
    while True:
        print(2222222)
        time.sleep(random.random() * 2)
def main():
    # text1()
    # text2()

    #创建多线程
    t1 = threading.Thread(target=text1)
    t2 = threading.Thread(target=text2)
    t1.start()  #执行多线程
    t2.start()

if __name__ == "__main__":
    main()

 2互斥锁:

在多线程之中全局变量是共享的;在执行过程中又可能会发生资源竞争,所以会用到互斥锁:比如

import threading
import time,os,random

num = 0
def text1(agr):
    global num
    for i in range(agr):
        num += 1
    print(num)

def text2(agr):
    global num
    for i in range(agr):
        num += 1
    print(num)


def main():

    t1 = threading.Thread(target=text1,args=(1000000,))
    t2 = threading.Thread(target=text2,args=(1000000,))
    t1.start()
    t2.start()

    time.sleep(5)
    print(num)

if __name__ == "__main__":
    main()

 执行结果:如下,而不是我们向看到的2000000

1170362
1302259
1302259

 如何解决呢,用到互斥锁:

import threading
import time,os,random

num = 0
def text1(agr,mutex):
    global num
    for i in range(agr):
        mutex.acquire()  #上锁
        num += 1
        mutex.release()  #解锁
    print(num)

def text2(agr,mutex):
    global num
    for i in range(agr):
        mutex.acquire()  #上锁
        num += 1
        mutex.release() #解锁

    print(num)


def main():
    mutex = threading.Lock()  #创建一个互斥锁
    t1 = threading.Thread(target=text1,args=(1000000,mutex))
    t2 = threading.Thread(target=text2,args=(1000000,mutex))
    t1.start()
    t2.start()

    time.sleep(5)
    print(num)

if __name__ == "__main__":
    main()

 结果:

1846157
2000000
2000000

 

以上是关于python3之线程的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记:python3,代码片段(2017)

python3之线程

Python3 与 C# 并发编程之~ 上篇

scrapy主动退出爬虫的代码片段(python3)

python 之 线程池实现并发

Python3 异步编程之进程与线程-1