进程与线程之一

1.对于一个单进程的程序来说,我们打印十行数据,查看需要的时间

import time
import threading
# print (time.ctime())

def f1(i):
    time.sleep(1)
    print (i,time.ctime())

for i in range(10):
    f1(i)

打印出结果:

0 Mon Aug 29 15:23:12 2016
1 Mon Aug 29 15:23:13 2016
2 Mon Aug 29 15:23:14 2016
3 Mon Aug 29 15:23:15 2016
4 Mon Aug 29 15:23:16 2016
5 Mon Aug 29 15:23:17 2016
6 Mon Aug 29 15:23:18 2016
7 Mon Aug 29 15:23:19 2016
8 Mon Aug 29 15:23:20 2016
9 Mon Aug 29 15:23:21 2016

2.但是当我们使用多线程来实现该程序的时候:

import time
import threading

def f1(i):
    time.sleep(1)
    print (i,time.ctime())

for i in range(10):
    t = threading.Thread(target=f1,args=(i,))
    t.start()

我们查看到结果是无序的切时间上是同一时间执行的:

0 Mon Aug 29 15:24:35 2016
2 Mon Aug 29 15:24:35 2016
1 Mon Aug 29 15:24:35 2016
4 Mon Aug 29 15:24:35 2016
3 Mon Aug 29 15:24:35 2016
5 Mon Aug 29 15:24:35 2016
7 Mon Aug 29 15:24:35 2016
9 Mon Aug 29 15:24:35 2016
6 Mon Aug 29 15:24:35 2016
8 Mon Aug 29 15:24:35 2016

1、一个应用程序可以是多进程,多线程。

2、默认单进程、单线程

3、单进程、多线程执行,在IO操作(不使用CPU,例如音频,视频都交给相应驱动了)的时候执行效率高,计算性的操作(需要使用CPU)需要使用多进程

4、GIL(全局解释器锁)

通过setDaemon可以设置主进程是否等待子进程结束,默认情况请主进程等待子进程结束之后才结束

import time
import threading
# print (time.ctime())

def f1(i):
    time.sleep(3)
    print (i,time.ctime())

t = threading.Thread(target=f1,args=(123,))
t.start()

print ("waiting...",time.ctime())

结果可以看到子进程很快执行完成,但是过了3秒之后子进程才结束,然后程序才结束执行。

waiting... Mon Aug 29 20:25:47 2016
123 Mon Aug 29 20:25:50 2016

如果将程序中setDaemon(True),那么主进程在子进程还没有结束的时候就已经结束了。

import time
import threading
# print (time.ctime())

def f1(i):
    time.sleep(3)
    print (i,time.ctime())

t = threading.Thread(target=f1,args=(123,))t.setDaemon(True)
t.start()

print ("waiting...",time.ctime())

那么执行的时候主进程已经结束了,子进程还在后台运行。

join函数用来确定主线程的等待时间

def f1(i):
    time.sleep(3)
    print (i,time.ctime())

t = threading.Thread(target=f1,args=(123,))
# t.setDaemon(True)
t.start()
t.join(2)

print ("waiting...",time.ctime())

执行结果:

waiting... Mon Aug 29 20:41:23 2016
123 Mon Aug 29 20:41:24 2016

t.join(2)说明最多等待线程2秒(默认会等待线程执行结束),等待2秒之后执行了主线程,然后子线程开始执行,最后程序退出。但是如果添加了setDeamon(True),那么先等待2秒,此时子进程还没有开始执行,程序就退出了。

线程的另外一种线程的创建方法,就是继承threading.Thread类

import threading
import time

class MyThread(threading.Thread):

    def __init__(self,func,args1,args2):
        self.func = func
        self.args1 = args1
        self.args2 = args2
        super(MyThread,self).__init__()

    def run(self):
        time.sleep(2)
        self.func(self.args1,self.args2)

def f2(args1,args2):
    print (args1 + args2,time.ctime())

obj = MyThread(f2,123,456)
obj.start()

f2(234,456)

执行结果:

690 Mon Aug 29 21:50:15 2016
579 Mon Aug 29 21:50:17 2016

obj.start()方法说明线程已经准备好了,这时候需要用CPU来调用obj.run()方法。

时间: 2024-10-29 03:55:08

进程与线程之一的相关文章

linux查看某个进程的线程id(spid)

鉴于linux下线程的广泛使用 我们怎么查看某个进程拥有的线程id了 现在很多服务的设计 主进程->子进程->线程(比如mysql,varnish) 主进程负责侦听网络上的连接 并把连接发送给子进程 子进程派生线程去处理这些线程 mysql(父进程460,子进程863) 1 460 425 333 ? -1 S 0 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/storage/mysql/backup --pid-file=/

该进程或线程自上一个步骤以来已更改

相关解决办法如下: VS进行高度时,断点处提示"该进程或线程自上一个步骤以来已更改" 每个断点跑两遍似的. 这个是由于在VS环境中 勾上了 "工具\选项--->调试--要求源文件与原始版本完全匹配"这个项 该进程或线程自上一个步骤以来已更改 英文表述:The process or thread has changed since last step 以下是是从网上摘录的解决办法. Q: I have a console application that exe

进程和线程、内核空间等概念

用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间.针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较

进程和线程有什么区别?

作者:榴莲艺声链接:https://www.zhihu.com/question/21535820/answer/22915780来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 一.关于进程和线程,首先从定义上理解就有所不同 1.进程是什么? 是具有一定独立功能的程序.它是系统进行资源分配和调度的一个独立单位,重点在系统调度和单独的单位,也就是说进程是可以独 立运行的一段程序. 2.线程又是什么? 线程进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的

Python自动化开发,Day10 - 进程、线程、协程

本章内容 操作系统发展史介绍 进程与线程的区别 python GIL全局解释器锁 线程 语法 join 线程锁Lock\Rlock\信号量 将线程变为守护进程 Event时间 Queue队列 生产者消费者模型 进程 语法 进程间通讯 进程池 一.操作系统发展史介绍 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存

进程、线程和上下文切换

进程是什么? 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed). 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元. 进程的概念主要有两点:第一,进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域(textregion).数据区域(data region

多线程编程(进程和线程)

多线程编程(进程和线程) 1.进程:指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程可以启动多个线程. 2.线程:指程序中一个执行流程,一个进程中可以运行多个线程. 一.创建线程(两种方式) 二.线程的5种状态( New,Runnable,Running,Block,Dead ): 三.线程的优先级 四.守护线程 /精灵线程/后台线程 五.方法 六.同步代码锁(synchronized) 一.创建线程(两种方式): 方式1:采用继承Thread的方法 第一,继承 Thre

进程与线程

1.进程与程序的区别? 进程与程序的区别:程序是指的存储在存储设备上(如磁盘)包含了可执行机器指 令(二进制代码)和数据的静态实体:而进程可以认为是已经被OS从磁盘加载到内存上的.动态的.可运行的指令与数据的集合,是在运行的动态实体. 2.进程的概念 程序的运行实例(但这并不代表进程就是在运行,根据OS的调度,进程会处于不同的状态),进程是OS进行资源分配的基本单位. 3.线程的概念 线程是进程的一个执行分支,是OS进行调度的基本单位. 4.进程与线程的区别 除了上述概念上的区别外,进程强调资源

走近并发编程之一 进程和线程

并发与并行,进程与线程不仅是操作系统中及其重要的概念,也是并发编程入门 必须要理解的核心知识. 什么是并发?并发与并行的区别 顺序编程:程序中的所有事物在任意时刻都只能执行一个步骤 并发:在同一时间段内,需要处理多个任务,而在每个时间点又只能处理一个,这就是并发. 假设我们要把多个任务分配给处理机,如果这台机器有多个处理器,显然可以同时执行这些任务,这就是并行. 不同于并行,并发的目的旨在最大限度的提高程序在单处理器上的效率.前者是在物理上的同时发生,而并发是在逻辑上的同时发生.如图,如果要在同

程序,进程,线程(需补充)

1.程序,进程,线程 程序:程序时完成特定任务的一系列指令集合. 进程:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程:线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发