Python第四周之多线程和多进程之线程加锁、五车争霸赛

# Information Technology# 摩尔定律 -- 任何买不起的电子产品,在18月后价格会降低一半,甚至更多。# 原因:电子产品每隔18个月,性能会翻翻。# 安迪比尔定律:安迪给你的东西,比尔都会给你拿走。硬件性能起来了,但是软件跟不上。# 所以:当软件更新时,硬件的性能需求将会提升。# 反摩尔定律:一个IT公司如果今天和18个月前卖掉同样多的、同样的产品,它的营业额就要降一半。IT界把它称为反摩尔定律。
# 线程加锁import time
from threading import Thread, Lock

class Account(object):

    def __init__(self):
        self._balance = 0
        self._lock = Lock()

    @property
    def balance(self):
        return self._balance

    def deposit(self, money):
        """当多个线程同时访问一个资源的时候,就有可能因为竞争资源导致状态崩溃
        被多个线程访问的资源,称为临界资源,对临界资源的访问需要加上保护。
        """
        if money:
            self._lock.acquire()  # 加锁,开始是并行,加锁后变成串行,解锁后变成并行。
            try:
                new_balance = self._balance + money
                time.sleep(0.01)
                self._balance = new_balance
            finally:
                self._lock.release()

class AddMoneyThread(Thread):

    def __init__(self, account):
        super(AddMoneyThread, self).__init__()
        self._account = account

    def run(self):
        self._account.deposit(1)

def main():
    account = Account()
    tlist = []
    for _ in range(100):
        t = AddMoneyThread(account)
        tlist.append(t)
        t.start()
    for t in tlist:
        t.join()
    print(‘%d元‘ % account.balance)

if __name__ == ‘__main__‘:
    main()

五车争霸赛

from random import randint
from threading import Thread

import pygame
import time

class Color(object):
    BLACK = (0, 0, 0)
    WHITE = (255, 255, 255)
    GRAY = (242, 242, 242)

    @staticmethod
    def random_color():
        r = randint(0, 255)
        g = randint(0, 255)
        b = randint(0, 255)
        return r, g, b

class Car(object):

    def __init__(self, x, y, color):
        self._x = x
        self._y = y
        self._color = color

    def move(self):
        if self._x <= 870:
            self._x += randint(1, 10)
            return True
        return False

    def draw(self, screen):
        pygame.draw.rect(screen, self._color, [self._x, self._y, 80, 40], 0)

def main():

    class BackgroundThread(Thread):

        def run(self):
            nonlocal screen
            is_go_on = True
            while is_go_on:
                screen.fill(Color.GRAY)

                pygame.draw.line(screen, Color.BLACK, (130, 0), (130, 600), 4)
                pygame.draw.line(screen, Color.BLACK, (950, 0), (950, 600), 4)
                for car in cars:
                    car.draw(screen)
                pygame.display.flip()
                time.sleep(0.05)
                for car in cars:
                    if not car.move():
                        is_go_on = False

    cars = []
    for i in range(5):
        temp = Car(50, i * 120 + 50, Color.random_color())
        cars.append(temp)

    pygame.init()
    screen = pygame.display.set_mode((1000, 600))
    pygame.display.set_caption(‘五车争霸赛‘)
    BackgroundThread(daemon=True).start()
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
    pygame.quit()

if __name__ == ‘__main__‘:
    main()
 

原文地址:https://www.cnblogs.com/zl666/p/8638413.html

时间: 2024-10-03 19:43:46

Python第四周之多线程和多进程之线程加锁、五车争霸赛的相关文章

Python第四周之多线程和多进程

# 多线程和多进程 进程:操作系统分配内存的基本单位,进程之间的通信相互隔离,如果要相互交换数据,需要特殊的机制. 线程:一个进程由至少一个线程组成,线程是进程的执行单元,也是操作系统分配CPU的基本单元. 多线程,是为了多的被CPU所启动. 优点: 1.缩短程序的执行时间,提升性能 2.改善用户的体验. 进程 调用方法一: 直接调用 . 直接创建对象Process,并通过target参数指定线程启动后要执行的任务 from multiprocessing import Process coun

Python36 1.joinablequeue 2.线程理论 3.多线程对比多进程 4.线程的使用方式 4.1.产生 线程的两种方式 4.2.守护线程 4.3.线程安全问题 4.3.1.互斥锁 4.3.2.死锁 4.3.3.可重入锁 4.3.4.信号量

复习1.守护进程2.互斥锁(解决数据错乱的方法)3.IPC(进程间通讯)4.生产者与消费者模型 详解:1.守护进程 一个进程可以设为另一个进程的守护进程 特点:被守护的进程结束时,守护进程也会随之结束 本质:父进程交给子进程一个任务,然而父进程 先于子进程结束了,子进程的任务也就没有必要 继续执行了 格式:开始前加 p.daemon=True 2.互斥锁(解决数据错乱的方法)方法一:互斥锁 互斥 互相排斥 锁的本质:一个标志 标志的两个状态: 1.锁定 2.未锁定 什么时候用? 当多个进程要操作

编程思想之多线程与多进程(2)——线程优先级与线程安全

原文:http://blog.csdn.net/luoweifu/article/details/46701167 作者:luoweifu 转载请标名出处 <编程思想之多线程与多进程(1)--以操作系统的角度述说线程与进程>一文详细讲述了线程.进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础.本文将接着讲一下线程优先级和线程安全. 线程优先级 现在主流操作系统(如Windows.Linux.Mac OS X)的任务调度除了具有前面提到的时间片轮转的特点外,还有优先级调度(Prior

多线程、多进程和线程池编程

一.python中的GIL 二.python多线程编程 三.线程间通信-Queue 四. 线程同步(Lock.RLock.Semaphores.Condition) 五.concurrent线程池编码 六.多进程编程-multiprocessing 七.进程间通信 原文地址:https://www.cnblogs.com/lyq-biu/p/10452933.html

编程思想之多线程与多进程(4)——C++中的多线程

<编程思想之多线程与多进程(1)--以操作系统的角度述说线程与进程>一文详细讲述了线程.进程的关系及在操作系统中的表现,<编程思想之多线程与多进程(2)--线程优先级与线程安全>一文讲了线程安全(各种同步锁)和优先级,这是多线程学习必须了解的基础.本文将接着讲一下C++中多线程程序的开发.这里主要讲Windows平台线程的用法,创建线程要调用windows API的CreateThread方法. 创建线程 在Windows平台,Windows API提供了对多线程的支持.前面进程和

多线程与多进程(4)

创建线程 在Windows平台,Windows API提供了对多线程的支持.前面进程和线程的概念中我们提到,一个程序至少有一个线程,这个线程称为主线程(main thread),如果我们不显示地创建线程,那我们产的程序就是只有主线程的间线程程序. 下面,我们看看Windows中线程相关的操作和方法: CreateThread与CloseHandle CreateThread用于创建一个线程,其函数原型如下: HANDLE WINAPI CreateThread( LPSECURITY_ATTRI

[转帖]编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程

编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程原创luoweifu 发布于2015-06-22 20:05:28 阅读数 75442 收藏展开 原文:http://blog.csdn.net/luoweifu/article/details/46595285 作者:luoweifu 转载请标名出处 其实我还有一个不太清楚的地方 一个进程 应该只能存在于一个核上面吧 一个进程的多个线程 应该不能跨越CPU的核心进行工作吧? 不太明白. 什么是线程什么是线程?线程与进程与有什么关系

10-多线程、多进程和线程池编程

一.多线程.多进程和线程池编程 1.1.Python中的GIL锁 CPython中,global interpreter lock(简称GIL)是一个互斥体,用于保护对Python对象的访问,从而防止多个线程一次执行Python字节码(也就是说,GIL锁每次只能允许一个线程工作,无法多个线程同时在CPU上工作).锁定是必要的,主要是因为CPython的内存管理不是线程安全的.(但是,由于存在GIL,因此其他功能已经变得越来越依赖于它所执行的保证.)CPython扩展必须支持GIL,以避免破坏线程

python并行处理任务时 该用多进程?还是该用多线程?

在python并行处理任务时要使用多线程还是多进程? 说到这个话题,必须要提的GIL( Global Interpreter Lock)全局解释锁,当Cpython每次执行字节码时都要先申请这个锁.那么问题就来了,如果使用多线程是比也会受到影响. 多线程和多进程程序比较,哪个性能更高?还是拿一个实例运行来看看吧- #写一个简单的例子,计算100W个随机数的和8次,同时将分散到8个线程进行运算. #thread.py #!/usr/bin/env python import random impo