欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多线程,多进程

程序员文章站 2024-03-17 17:40:52
...

进程是资源分配的最小单位,线程是CPU调度的最小单位
什么是线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。一个线程是一个execution context(执行上下文),即一个cpu执行时所需要的一串指令。

进程
一个程序的执行实例就是一个进程。每一个进程提供执行程序所需的所有资源。(进程本质上是资源的集合)

进程与线程区别
1.同一个进程中的线程共享同一内存空间,但是进程之间是独立的。

2.同一个进程中的所有线程的数据是共享的(进程通讯),进程之间的数据是独立的。

3.对主线程的修改可能会影响其他线程的行为,但是父进程的修改(除了删除以外)不会影响其他子进程。

4.线程是一个上下文的执行指令,而进程则是与运算相关的一簇资源。

5.同一个进程的线程之间可以直接通信,但是进程之间的交流需要借助中间代理来实现。

6.创建新的线程很容易,但是创建新的进程需要对父进程做一次复制。

7.一个线程可以操作同一进程的其他线程,但是进程只能操作其子进程。

8.线程启动速度快,进程启动速度慢(但是两者运行速度没有可比性)。

http://www.cnblogs.com/whatisfantasy/p/6440585.html

多线程,多进程

1)需要频繁创建销毁的优先用线程
这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的

2)需要进行大量计算的优先使用线程
所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。

这种原则最常见的是图像处理、算法处理。

3)强相关的处理用线程,弱相关的处理用进程
什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。

一般的Server需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。因此“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计。

当然这种划分方式不是一成不变的,也可以根据实际情况进行调整。

4)可能要扩展到多机分布的用进程,多核分布的用线程

创建进程:
Python的os模块封装了常见的系统调用,其中就包括fork,可以在Python程序中轻松创建子进程,但fork()函数只能在Linux上面使用:

import os

#注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以

pid = os.fork()

if pid == 0:

    print('哈哈1')

else:

    print('哈哈2')

而在windows上面使用multiprocessing模块来创建多进程,这模块是跨平台的多进程模块

multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:

#coding=utf-8

from multiprocessing import Process

import os

#子进程要执行的代码

def run_proc(name):

print('子进程运行中,name= %s ,pid=%d...' % (name, os.getpid()))

if name==‘main’:

print('父进程 %d.' % os.getpid())

p = Process(target=run_proc, args=('test',))

print('子进程将要执行')

p.start()

p.join()

print('子进程已结束')

多线程,多进程

Process([group [, target [, name [, args [, kwargs]]]]])

· target:表示这个进程实例所调用对象;

· args:表示调用对象的位置参数元组;

· kwargs:表示调用对象的关键字参数字典;

· name:为当前进程实例的别名;

· group:大多数情况下用不到;

Process类常用方法:

· is_alive():判断进程实例是否还在执行;

· join([timeout]):是否等待进程实例执行结束,或等待多少秒;

· start():启动进程实例(创建子进程);

· run():如果没有给定target参数,对这个对象调用start()方法时,就将执行对象中的run()方法;

· terminate():不管任务是否完成,立即终止;

Process类常用属性:

· name:当前进程实例别名,默认为Process-N,N为从1开始递增的整数;

· pid:当前进程实例的PID值;

相关标签: python