美文网首页
36.2-进程和线程以及线程的创建和传参

36.2-进程和线程以及线程的创建和传参

作者: BeautifulSoulpy | 来源:发表于2020-02-07 07:26 被阅读0次

没有比脚更长的路,没有比人更高的山,没有做不到的事,只有想不到的人。阻挡你前进的不是高山大海,而往往是自己鞋底一粒小小的沙粒!

心态决定苦与乐,观念决定成与败!

总结:

  1. 进程管理:现代操作系统必须实现进程管理;不同操作系统实现进程管理是由差异的;
  2. Python中关于线程的概念能简化就简化了,不像其他语言中要学习那么多;没有close\exit等方法;
  3. Python中传参数是 单个参数args 是元组(5,)

1. 进程与线程

线程:操作系统能够进行运算调度的最小单位。它被包含在进程中,是进程中的实际运作单位。是一串指令的集合;
一个线程指的是进程中一个单一顺序的控制流,一个进程是中可以并发多个线程,每个线程并行执行不同的任务

进程:以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存的管理,网络接口的调用等,对各种资源管理的集合,就可以称为进程
进程要操作cpu,必须先创建一个线程,所有在同一个进程里的线程是共享同一块内存空间的

注意:
1.进程本身不能够执行
2.进程和线程不能比较谁快谁慢,两个没有可比性,进程是资源的集合,线程是真正执行任务的,进程要执行任务也要通过线程;
3.启动一个线程比启动一个进程快

进程和程序的关系
程序是源代码编译后的文件,而这些文件存放在磁盘上。当程序被操作系统加载到内存中,就是进程,进程中存放着指令和数据(资源),它也是线程的容器。

Linux进程有父进程、子进程,Windows的进程是平等关系。

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。
一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
在许多系统中,创建一个线程比创建一个进程快10-100倍。

进程、线程的理解
现代操作系统提出进程的概念,每一个进程都认为自己独占所有的计算机硬件资源。
进程就是独立的王国,进程间不可以随便的共享数据。
线程就是省份,同一个进程内的线程可以共享进程的资源,每一个线程拥有自己独立的堆栈。

2. 线程的状态

状态 含义
就绪(Ready) 线程能够运行,但在等待被调度。可能线程刚刚创建启动,或刚刚从阻塞中恢复,或者被
其他线程抢占
运行(Running) 线程正在运行
阻塞(Blocked) 线程等待外部事件发生而无法运行,如I/O操作
终止 线程完成,或退出,或被取消

3. Python中的进程和线程

进程会启动一个解释器进程,线程共享一个解释器进程。

4. Python的线程开发

Python的线程开发使用标准库threading

Thread类

# 签名
def \__init__(self, group=None, target=None, name=None,args=(), kwargs=None, *, daemon=None)
参数名 含义
target 线程调用的对象,就是目标函数
name 为线程起个名字
args 为目标函数传递实参,元组
kwargs 为目标函数关键字传参,字典

线程启动

import threading
import time
# 最简单的线程程序
def worker():
    time.sleep(1)
    print("I'm working")
    print('Fineshed')
t = threading.Thread(target=worker, name='worker') # 线程对象
t.start() # 启动
#-------------------------------------------------
I'm working
Fineshed

通过threading.Thread创建一个线程对象,target是目标函数,name可以指定名称。
但是线程没有启动,需要调用start方法。
线程之所以执行函数,是因为线程中就是执行代码的,而最简单的封装就是函数,所以还是函数调用。
函数执行完,线程也就退出了。

那么,如果不让线程退出,或者让线程一直工作怎么办呢 ? while True;

import threading
import time
def worker():
    while True:
        time.sleep(1)
        print("I'm working")
    print('Fineshed')
t = threading.Thread(target=worker, name='worker') # 线程对象
t.start() # 启动
#-------------------------------------------------------------------------------------------

线程退出

Python没有提供线程退出的方法,线程在下面情况时退出
1、线程函数内语句执行完毕
2、线程函数中抛出未处理的异常

# 1、线程函数内语句执行完毕 :循坏退出
import threading
import time

def worker():
    count = 0
    while True:
        time.sleep(1)
        print("I'm working")
        print('Fineshed')
        count += 1
        if count > 5:
            break
            # return

t = threading.Thread(target=worker, name='worker')  # 线程对象
t.start()  # 启动

print('--end--')
#--------------------------------------------------------------------------------------------
--end--
I'm working
Fineshed
I'm working
Fineshed
I'm working
Fineshed
I'm working
Fineshed
I'm working
Fineshed
I'm working
Fineshed



# 2、线程函数中抛出未处理的异常
import threading
import time

def worker():
    count = 0
    while True:
        time.sleep(1)
        print("I'm working")
        print('Fineshed')
        count += 1
        if count > 5:
            raise Exception('Thread error!')

t = threading.Thread(target=worker, name='worker')  # 线程对象
t.start()  # 启动

print('--end--')
#----------------------------------------------------------------------------------
Exception: Thread error!

Python的线程没有优先级、没有线程组的概念,也不能被销毁、停止、挂起,那也就没有恢复、中断了。

线程的传参
线程传参和函数传参没什么区别,本质上就是函数传参
要么args ; 要么kwargs ;

import threading
import time

def worker(x,y):
    count = 0
    while True:
        time.sleep(1)
        print("I'm working")
        print('Fineshed')
        count += 1
        if count > x:
            break

#t = threading.Thread(target=worker, name='worker',args=(5,100))  # 线程对象  args
t = threading.Thread(target=worker, name='worker',kwargs={'x':5,'y':100})  # 线程对象  kwarsg
t.start()  # 启动

print('--end--')

相关文章

  • 36.2-进程和线程以及线程的创建和传参

    没有比脚更长的路,没有比人更高的山,没有做不到的事,只有想不到的人。阻挡你前进的不是高山大海,而往往是自己鞋底一粒...

  • 线程的创建和控制

    线程的创建和控制 进程和线程的关系:进程提供资源,线程使用资源完成工作 创建线程函数 线程的控制 更多的API 创...

  • Java线程

    首先了解一下什么是线程,再讨论Java中线程的创建和结束。 一、线程和进程 1.1 线程和进程的区别 线程和进程都...

  • Python 多任务 - 02 进程

    目录一、进程概念二、使用Process完成多线程三、进程、线程的区别四、通过队列完成进程间通信五、进程池概念以及创...

  • iOS进程间通信

    线程间通信 :通过performSelector系列的方法 可以实现 各种线程间的通信(通信 :调用与传参)进程间...

  • 多线程 以及 线程安全

    移动端开发过程中,会出现 进程 和 线程的概念,以及多线程中 线程安全 的问题。 进程 和 线程 进程: APP...

  • Java 线程基础

    ? 本文以及示例源码已归档在 javacore 一、线程简介什么是进程什么是线程进程和线程的区别 二、线程基本用法...

  • 线程和进程概念

    线程和进程 进程 线程 线程和进程的区别

  • OC-底层原理 23:多线程原理

    本文的目的在于了解进程、线程、多线程、线程池等的基本概念及原理 线程 和 进程 线程和进程的定义 线程 线程时进程...

  • iOS 多线程原理

    本文的目的在于了解进程、线程、多线程、线程池等的基本概念及原理 线程 和 进程 线程和进程的定义 线程 线程时进程...

网友评论

      本文标题:36.2-进程和线程以及线程的创建和传参

      本文链接:https://www.haomeiwen.com/subject/duevactx.html