关于进程与线程的理解(python实现)

一、概念及区别
概念
1. 进程:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。
2. 线程:线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据
3. 协程:**协程是一种用户态的轻量级线程,**协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
区别
1. 进程和线程的区别http://https://blog.csdn.net/qq_34974749/article/details/105442584
2. 线程与协程的区别

  1. 一个线程可以拥有多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU。

  2. 线程进程都是同步机制,而协程则是异步

  3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态

多进程和多线程的同时运行,可以大大提高计算机的运行效率。许多任务既可以通过多进程实现,也可以通过多线程实现。利用多进程实现时,由于进程是申请和获得系统资源的基本单位,进程之间界限明显,单个进程的崩溃一般不会影响到其他进程的运行,因此,用多进程方法执行任务可靠性比较高,但是,由于每个进程拥有自己独立的资源,使得多进程方法耗费系统资源较多。利用多线程实现时,由于同一进程的多个线程共享进程所拥有的资源,因此,用多线程方法执行任务资源耗费少,效率比较高,但是,由于多个线程共享相同的资源,单个线程的崩溃会影响到其他线程的运行,使得多线程方法的可靠性下降。实际应用中,到底是使用多进程、多线程还是多进程与多线程的结合,要视具体情况来确定。

#!/usr/bin/env python3 
#coding=utf-8 
""" 
@author:oxff
@github:https://github.com/oxff644
  """ 
#执行Linux命令和获取主机CPU核数 
from _multiprocessing import cpu_count
import subprocess 
subprocess.call(['pwd']) 
subprocess.call(['ls','-l','/'])
num_cores =cpu_count() 
print('Your computer has %d cores.' % num_cores)

二、多进程编程与多线程编程
1.多进程编程

#!/usr/bin/env python3
#coding=utf-8
"""
@author:oxff
@github:https://github.com/oxff644
"""
#利用多进程为客户端提供文件下载服务
from multiprocessing import Process
import socket
import os
def sendfile(conn):
    strl =conn.recv(1024)
    filename =strl.decode('utf-8')
    print('I am child process,my ID is',os.getpid())
    print("The client requests my file:",filename)
    if os.path.exists(filename):
        print('I have %s,begin to download!' %filename)
        conn.send(b'yes')
        conn.recv(1024)
        size =1024
        with open(filename,'rb') as f:
            while True:
                data =f.read(size)
                conn.send(data)
                if len(data)<size:
                    break
                print('%s is download successfully!' %filename)
    else:
        print('sorry,I have no %s' % filename)
        conn.send(b'no')
    conn.close()
s= socket.socket(socket.AF_PACKET,socket.SOCK_STREAM)
s.bind('192.168.0.103','8088')
s.listen(100)
print('I am parent process,my ID is',os.getpid())
print('wait for connecting.....')
while True:
    (conn,addr)=s.accept()
    p =Process(target=sendfile,args =(conn,))
    p.start()

2.多线程编程

#!/usr/bin/env python3
#coding=utf-8
"""
@author:oxff
@github:https://github.com/oxff644
"""
#利用多线程为客户端提供文件下载服务
import threading
import socket
import os
def sendfile(conn):
    str1 =conn.recv(1024)
    filename =str1.decode('utf-8')
    print('I am',threading.current_thread().name)
    print('The client requests my file:',filename)
    if os.path.exists(filename):
        print('I have %s,begin to download!' %filename)
        conn.send(b'yes')
        conn.recv(1024)
        size =1024
        with open(filename,'rb') as f:
            while True:
                data =f.read(size)
                conn.send(data)
                if len(data)<size:
                    break
        print('%s is downloaded successfully' % filename)
    else:
        print('Sorry~~,I have no %s' % filename)
        conn.send(b'no')
    conn.close()
s= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('192.168.0.103',8088))
s.listen(100)
print('wait for connecting....')
while True:
    (conn,addr) =s.accept()
    t =threading.Thread(target=sendfile,args=(conn,))
    t.start()

对比进程池和线程池,进程池中不同子进程对应的函数可以不同,但线程池所有线程对应的函数都是同一个函数,这就导致了实参组织方式的不同,进程池每个子进程参数单独指定,而线程池中每个线程的参数从列表中依次取得。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值