进程和线程

进程与线程的简介:

进程 - 操作系统分配内存的基本单位,进程之间的内存相互独立的,ipc机制可以相互访问,套接字(sokect)
线程 - 一个进程可以划分为多个线程,线程是进程的执行单元也是操作系统分配cpu的基本单元
为什么要使用多线程:得到更多的cpu的调用
1 如果一个任务执行时间很长 我们就可以将一个任务分为多个线程 改善程序的执行效率 缩短执行时间
2 改善用户体验

进程的定义与使用

关键字Process例如:

import time
from multiprocessing import Process
import os

# process
# thread


def output():
    print(os.getpid())  # 端口号
    while True:
        print('ljl', end='', flush=True)
        time.sleep(1)


def main():
    print(os.getpid())
    Process(target=output).start()  # 子进程
    while True:
        print('zy', end='', flush=True)
        time.sleep(1)


if __name__ == '__main__':
    main()

使用进程模拟下载文件:

import time
import random
from threading import Thread
from multiprocessing import Process

# 如果多个任务之间没有任何的关联(独立子任务)而希望利用CPU的多核特性
# 那么我们推荐使用多进程
# Information Technology
# 摩尔定律 -
# 安迪比尔定律 -
# 反摩尔定律 -


def download(filename):
    print('开始下载%s。。。' % filename)
    delay = random.randint(5, 15)
    time.sleep(delay)
    print('%s下载完成,用时%d秒.' % (filename, delay))


def main():
    start = time.time()
    p1 = Process(target=download, args=('python从入门到住院.pdf', ))
    p1.start()
    p2 = Process(target=download, args=('pekin  hot.avi.pdf',))
    p2.start()
    p1.join()  # 等待p1进程结束  join()保护进程
    p2.join()
    end = time.time()
    print('总共耗费了%f秒' % (end - start))


if __name__ == '__main__':
    main()

线程

守护线程 不值得保留的线程 其它线程如果都执行完毕了那么守护线程自动结束
daemon=True 将线程设置为守护线程

t1 = Thread(target=output, args=('zy', ), daemon=True)  # 定义一个名为t1的线程, target 表示的是要执行的动作 方法 函数名
t1.start()
t2 = Thread(target=output, args=('ljl', ), daemon=True)  # deamon 守护线程  当主程序结束则结束
t2.start()

使用线程
当然创建线程我们也可以使用函数来创建,例如:

from threading import Thread

# 创建线程的两种方式

# 1. 直接创建Thread对象并通过target参数指定线程启动后要执行的任务
# 2. 继承Thread自定义线程  通过写run方法指定线程启动后执行的任务


class PrintThread(Thread):

    def __init__(self, string, count):
        super().__init__()
        self._string = string
        self._count = count

    def run(self):  # 这里的run方法不能更改函数名
        """需要写的判断条件或者循环条件"""
        for _ in range(self._count):
            print(self._string, end='', flush=True)  # flush是将相应的立即输出


def main():
    PrintThread('pin', 5).start()
    PrintThread('pon', 5).start()


if __name__ == '__main__':
    main()

1.多线程控制小车的移动以及绘制窗口。

from random import randint
from threading import Thread
import pygame
import time
# 2   赛车游戏  5 个线程控制5个车移动
BLACK_COLOR = [0, 0, 0]
GREEN_COLOR = [0, 255, 0]
WHITE_COLOR = [255, 255, 255]


class GameObject(object):

    def __init__(self, x, y, size):
        self._x = x
        self._y = y
        self._size = size

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, x):
        self._x = x

    def draw(self, screen):
        pass


class Car(GameObject):

    def __init__(self, x, y, size):
        super().__init__(x, y, size)

    def draw(self, screen):
        pygame.draw.rect(screen, GREEN_COLOR, [self._x, self._y, self._size, self._size], 0)
        pygame.draw.rect(screen, WHITE_COLOR, [self._x, self._y, self._size, self._size], 1)

    def move(self):
        if self._x + self._size < 400:
            self._x += randint(5, 10)


def main():
    class My_thread(Thread):

        def run(self):
            while True:
                screen.fill((255, 255, 255))
                pygame.draw.line(screen, BLACK_COLOR, (30, 0), (30, 200), 4)
                pygame.draw.line(screen, BLACK_COLOR, (400, 0), (400, 200), 4)
                for car in car_list:
                    car.draw(screen)
                pygame.display.flip()
                time.sleep(0.1)
                for car in car_list:
                    car.move()

    car_list = []
    for index in range(5):
        car1 = Car(10, 10 + 40 * index, 20)
        car_list.append(car1)
    pygame.init()
    screen = pygame.display.set_mode([500, 200])
    pygame.display.set_caption('小车车')
    my_thread = My_thread(daemon=True)
    my_thread.start()
    runing = True
    while runing:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                runing = False
        # screen.fill([200, 200, 200])
        pygame.display.flip()
    pygame.quit()


if __name__ == '__main__':
    main()

2.多个人给一个银行账户转钱

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 > 0:
            # 加锁 别乱加锁
            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, user):
        super().__init__()
        self._user = user

    def run(self):
        self._user.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()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 进程和线程 进程线程的区别1、进程是什么?是具有一定独立功能的程序、它是系统进行资源分配和调度的一个独立单位,重点...
    HeartGo阅读 1,192评论 0 4
  • 进程和线程的区别: 对于进程来说,子进程是父进程的复制品,从父进程那里获得父进程的数据空间,堆和栈的复制品。 而线...
    nine_9阅读 574评论 0 0
  • 本系列主要学习Python的基本使用和语法知识,后续可能会围绕着AI学习展开。Python3 (1) Python...
    猿来如痴阅读 1,434评论 0 5
  • 在iOS开发中,播放视频通常有两种方式,一种是使用MPMoviePlayerController(需要导入Medi...
    云天大侠_general阅读 5,848评论 2 7
  • 初遇瑜伽,18岁那年的暑假,因失恋初次走进瑜伽教室。只希望通过瑜伽能让自己平静下来,忘记伤痛。当轻柔的音乐响起,坐...
    行走的柠檬檬阅读 165评论 3 1