栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Python多线程并发编程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python多线程并发编程

一、Python中的GIL
"""
GIL的全称global interpreter lock 意为全局解释器锁。
Python中的一个线程对应与c语言中的一个线程。
GIL使得同一时刻一个CPU只能有一个线程执行字节码, 无法将多个线程映射到多个CPU上执行。
GIL会根据执行的字节码行数以及时间释放GIL,GIL在遇到IO的操作时候会主动释放。
"""

# GIL会释放,释放的位置不定,最后的结果不定
import threading
total = 0


def add():
    global total
    for i in range(1, 1000000):
        total += 1


def sub():
    global total
    for i in range(1, 1000000):
        total -= 1


t1 = threading.Thread(target=add)
t2 = threading.Thread(target=sub)
t1.start()
t2.start()
t1.join()
t2.join()
print(total)

运行结果:

-296591

二、Python多线程编程 2.1、通过threading实现多线程
import threading
import time


def thread1():
    print('thread1:start_time:%s' % time.time())
    time.sleep(2)
    print('thread1:end_time:%s' % time.time())


def thread2():
    print('thread2:start_time:%s' % time.time())
    time.sleep(2)
    print('thread2:end_time:%s' % time.time())


if __name__ == '__main__':
    t1 = threading.Thread(target=thread1)
    t2 = threading.Thread(target=thread2)
    start_time = time.time()
    t1.start()
    t2.start()
    # 时间非常小,是运行代码的时间差,而不是2秒
    # 这样运行一共有三个线程,主线程和其它两个子线程(thread1、thread2),而且是并行的,子线程启动后,主线程仍然往下运行,因此时间不是2秒
    # 守护线程(主线程退出,子线程就会kill掉)
    print('end_time:{}'.format(time.time()-start_time))

运行结果:

thread1:start_time:1657777068.6530874
thread2:start_time:1657777068.6530874
end_time:0.0010001659393310547
thread1:end_time:1657777070.6686676
thread2:end_time:1657777070.6686676

2.2、守护线程
import time
import threading


def thread1(s):
    print('thread1:start_time:%s' % time.time())
    time.sleep(s)
    print('thread1:stop_time:%s' % time.time())


def thread2(s):
    print('thread2:start_time:%s' % time.time())
    time.sleep(s)
    print('thread2:stop_time:%s' % time.time())


if __name__ == '__main__':
    t1 = threading.Thread(target=thread1, args=(2,))
    t2 = threading.Thread(target=thread2, args=(1,))
    # 将线程t1设置成守护线程
    """当程序中非守护线程全部运行完,只有守护线程时,守护线程没有了守护对象,守护线程就会被kill掉。"""
    t1.setDaemon(True)
    start_time = time.time()
    t1.start()
    t2.start()
    print('end_time:{}'.format(time.time() - start_time))

运行结果:

thread1:start_time:1657777183.1204586
thread2:start_time:1657777183.121459
end_time:0.0010004043579101562
thread2:stop_time:1657777184.1246376

2.3、等某个子线程执行完再继续执行主线程(join)
import time
import threading
from threading import current_thread


def thread1(s):
    print('%s:start_time:%s' % (current_thread().getName(), time.time()))
    time.sleep(s)
    print('%s:end_time:%s' % (current_thread().getName(), time.time()))


def thread2(s):
    print('%s:start_time:%s' % (current_thread().getName(), time.time()))
    time.sleep(s)
    print('%s:end_time:%s' % (current_thread().getName(), time.time()))


if __name__ == '__main__':
    t1 = threading.Thread(target=thread1, args=(2,))
    t2 = threading.Thread(target=thread2, args=(1,))
    t1.setName('thread1')
    t2.setName('thread2')
    start_time = time.time()
    t1.start()
    # 等待线程t1执行完
    t1.join()
    t2.start()
    # 等待线程t2执行完
    t2.join()
    print('end_time:{}'.format(time.time() - start_time))

运行结果:

thread1:start_time:1657777605.7998574
thread1:end_time:1657777607.8096633
thread2:start_time:1657777607.8096633
thread2:end_time:1657777608.823355
end_time:3.024498701095581

2.4、继承Thread实现多线程
import time
import threading
from threading import current_thread


class Thread1(threading.Thread):
    def run(self):
        # 获取当前线程名称
        name1 = current_thread().getName()
        name2 = self.getName()
        name3 = self.name
        print('线程名1:', name1, name2, name3)
        print('%s:start_time:%s' % (self.name, time.time()))
        time.sleep(2)
        print('%s:end_time:%s' % (self.name, time.time()))


class Thread2(threading.Thread):
    def run(self):
        name1 = current_thread().getName()
        name2 = self.getName()
        name3 = self.name
        print('线程名2:', name1, name2, name3)
        print('%s:start_time:%s' % (self.name, time.time()))
        time.sleep(1)
        print('%s:end_time:%s' % (self.name, time.time()))


if __name__ == '__main__':
    thread1 = Thread1()
    thread2 = Thread2()
    # 设置线程名称
    thread1.setName('thread1')
    thread2.setName('thread2')
    start_time = time.time()
    thread1.start()
    thread2.start()
    thread1.join()
    thread2.join()
    print('end_time:{}'.format(time.time() - start_time))

运行结果:

线程名1: thread1 thread1 thread1
thread1:start_time:1657777734.236593
线程名2: thread2 thread2 thread2
thread2:start_time:1657777734.2375908
thread2:end_time:1657777735.243757
thread1:end_time:1657777736.2522626
end_time:2.016672372817993

三、线程同步 线程锁机制(Lock)
import threading
from threading import Lock
total = 0
lock = Lock()


def add():
    global total
    for i in range(1, 1000000):
        # 获取锁
        lock.acquire()
        total += 1
        # 释放锁
        lock.release()


def sub():
    global total
    for i in range(1, 1000000):
        lock.acquire()
        total -= 1
        lock.release()


if __name__ == '__main__':
    t1 = threading.Thread(target=add)
    t2 = threading.Thread(target=sub)
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print(total)

运行结果:

0

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1016409.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号