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

 

 
posted @ 2018-03-24 12:25  摇还是不摇  阅读(186)  评论(0编辑  收藏  举报