在一个CPU(一核)的电脑上,

程序的运行是并发运行的,调度的算法叫时间片轮转法,也叫轮询法

在多CPU(多核)的电脑上,一个CPU跑一个程序,刚程序运行数量小于核心数时,程序是并行的

并发:看上去一起执行,同时在发生

并行:真正的一起执行,同时在进行

进程的概念:

  计算机程序是存储在磁盘上的可执行二进制(或者其他类型)文件

    只有当他们被加载到内存中,并被操作系统调用的时候,他们才会拥有自己的生命周期

  进程则表示一个正在执行的程序

    每个程序都拥有自己的地址空间,内存,数据栈以及其他用于跟踪执行的辅助资料

  操作系统负责其上的所有进程的执行

    操作系统会为这些进程合理的分配执行时间

线程的概念:

  线程被称作轻量级进程

     与进程类似,不过他们是在不同的进程下执行的。并且他们会共享相同的上下文

  当其他线程执行时,他可以被抢占(中断),和临时挂起(睡眠)---------让步

    线程的轮询调度机制类似于进程的轮询调度。只不过这个调度不是由操作系统来负责的,而是由python解释器来负责

CPU,进程,线程之间的调度关系

CPU——>进程——>线程

利用进程和线程,实现并发服务器

线程:(GIL全局解释器锁:遇到阻塞就切换)

from socket import *
import threading
server = socket()
server.bind(('', 9999))
server.listen(1000) def func(conn):
while True:
recv_date = conn.recv(1024)
if recv_date:
print(recv_date.decode('utf8'))
conn.send(recv_date)
else:
conn.close()
break while True:
conn, addr = server.accept()
w = threading.Thread(target=func, args=(conn, )) # 开启一个子线程
w.start()

进程:

import multiprocessing
from socket import *
server = socket()
server.bind(('', 9999))
server.listen(10) def func(conn):
while True:
recv_date = conn.recv(1024)
if recv_date:
print(recv_date.decode('utf8'))
conn.send(recv_date)
else:
conn.close()
break while True:
conn, addr = server.accept()
w = multiprocessing.Process(target=func, args=(conn, )) # 开启一个子进程
w.start()

补充:

  等待结束:.join()  

     我们调用的子进程或者子线程,阻塞等待,直到进程或者线程结束

from threading import Thread
from time import sleep, ctime def func():
sleep(5)
print('子进程结束了')
print(ctime()) print(ctime())
t = Thread(target=func)
t.start()
t.join() # 等待子线程执行完毕才会继续往下执行
sleep(5)
print('主进程结束')
print(ctime()) 程序会执行10秒才会结束 如果没有t.join()
子线程和主进程同时执行,用时5秒

  查看当前进程和当前线程   multiprocessing.current_process() / multiprocessing.current_thread()

    还是之前的代码

 import multiprocessing
from threading import Thread, current_thread
from time import sleep,ctime def func(): print(multiprocessing.current_thread())
print('子进程结束了')
print(ctime())
t = Thread(target=func)
t.start()
t.join()
print(multiprocessing.current_process())
print('主进程结束') <Thread(Thread-1, started -1223357632)>
子进程结束了
<_MainProcess(MainProcess, started)>
主进程结束 Process finished with exit code 0

  终止进程  进程/线程.terminate()

    强制终止子进程/线程,不管进程/线程有没有执行完毕,直接结束

  进程/线程的标志    进程print(multiprocessing.process().pid)

           线程print(threading..current_thread().ident)

 import threading
from time import sleep,ctime
import multiprocessing def func():
# sleep(5)
print(threading.current_thread())
print(threading.current_thread().ident)
print('子进程结束了')
print(ctime()) print(ctime())
t = threading.Thread(target=func)
t.start()
t.join()
print(multiprocessing.current_process())
print(multiprocessing.current_process().pid)
print('主进程结束')
print(ctime()) <Thread(Thread-1, started -1223124160)>
-1223124160
子进程结束了
Sat Aug 18 14:53:22 2018
<_MainProcess(MainProcess, started)>
3885
主进程结束
Sat Aug 18 14:53:22 2018 Process finished with exit code 0

    查看进程/线程名      实例化的时候输入:m = multiprocessing.Process(target=func, name = 'xxxx')

             或者实例化的声明  m.name = 'xxxx'

from multiprocessing import Process

def func():
pass m = Process(target=func, name='pywjh')
'''
或者m = Process(target=func)
m.name = 'pywjh'
''' print('1>>', m)
m.start()
print('2>>', m)
m.join()
print('3>>', m) 1>> <Process(pywjh, initial)> # 最初
2>> <Process(pywjh, started)> # 开始
3>> <Process(pywjh, stopped)> # 结束 Process finished with exit code 0

  查看进程/线程是否还在运行    print(m.is_alive(),m)

 from multiprocessing import Process

 def func():
pass m = Process(target=func, name='pywjh')
'''
或者m = Process(target=func)
m.name = 'pywjh'
''' print('1>>', m.is_alive(), m)
m.start()
print('2>>', m.is_alive(), m)
m.join()
print('3>>', m.is_alive(), m) 1>> False <Process(pywjh, initial)>
2>> True <Process(pywjh, started)> # 只有start才算活着
3>> False <Process(pywjh, stopped)> Process finished with exit code 0

    守护进程/线程    daemon = True    p = Process(target=func, daemon=True)

      把这个进程设置为守护进程随主线程关闭而关闭

       

python下的线程 进程,以及如何实现并发服务器的更多相关文章

  1. python笔记9 线程进程 threading多线程模块 GIL锁 multiprocessing多进程模块 同步锁Lock 队列queue IO模型

    线程与进程 进程 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要 ...

  2. Python嫌多(线程/进程)太慢? 嫌Scrapy太麻烦?没事,异步高调走起!——瓜子二手车

    基本概念了解: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我 ...

  3. Python学习笔记(六)多进程实现并发服务器

    这个相对于多进程更加简单,每accept一个新的连接就创建一个新的线程.代码如下: # coding: utf-8 import socket import sys import errno impo ...

  4. Python 中的线程-进程2

    原文:https://www.cnblogs.com/i-honey/p/7823587.html Python中实现多线程需要使用到 threading 库,其中每一个 Thread类 的实例控制一 ...

  5. Python学习之==>线程&&进程

    一.什么是线程(thread) 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一个线程指的是进程中一个单一顺序的控制流,一个进程中可以包含多个线程,每条线程并行 ...

  6. Python 中的线程-进程1

    原文:https://www.cnblogs.com/i-honey/p/8042047.html 1. 并行和并发 并行:同时做某些事,可以互不干扰的同一时刻做几件事. 并发:也是同时做某些事,但是 ...

  7. 人生苦短之我用Python篇(线程/进程、threading模块:全局解释器锁gil/信号量/Event、)

    线程: 有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.是一串指令的集合.线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是 ...

  8. Python学习笔记(五)多进程实现并发服务器

      每创建一个TCP连接,就创建一个进程. 代码如下: # coding: utf-8 import socket import os import sys import signal import ...

  9. python之线程进程协成

    线程与进程 什么是线程 线程是进程一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可与同属一个线程的 ...

随机推荐

  1. 2014百度之星第二题Disk Schedule(双调欧几里得旅行商问题+DP)

    Disk Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  2. 【Linux】Linux下配置apache

    一.获取软件: http://httpd.apache.org/   httpd-2.4.10.tar.gz 二.安装步骤: 解压源文件: 1) tar zvxf  httpd-2.4.10.tar. ...

  3. Microsoft ASP.NET SignalR

    SignalR类似与JavaScript实时框架,如Socket.IO.SignalR能够完成客户端向服务器的异步通信,并同时支持服务器向浏览器客户端推送事件.SignalR的连接通过日益流行的Web ...

  4. 【BZOJ 1230】 开关灯

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1230 [算法] 线段树 [代码] #include<bits/stdc++.h ...

  5. bzoj 1029 [ JSOI 2007 ] 建筑抢修 —— 贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1029 想不出来贪心... 首先把任务按结束时间排序: 因为任务一定是越提前做越好,所以从头开 ...

  6. Shredding Company(dfs)

    http://poj.org/problem?id=1416 题意:将一个数分成几部分,使其分割的各个数的和最大并且小于所给的数. 凌乱了..参考的会神的代码..orz... #include < ...

  7. android平台 cocos2d-x 读取相册数据

    现已解决 方案如下: 1.使用 jni 调用 java 方法 启动相册选择框2.使用java将获取的图片保存到本地3.使用Cocos2d-x中 CCImage 读取 JAVA代码如下: //启动图片选 ...

  8. 简单ajax库

    function TuziAjax(reqType,url,fnoK, fnFail) { var xmlHttp = null; if (window.XMLHttpRequest) { xmlHt ...

  9. Visual C++6.0的下载与安装

    1.Visual C++6.0的下载 本书中使用的Visual C++6.0的中文版,读者可以在网上搜索,下载合适的安装包. 2.Visual C++6.0的安装 Visual C++6.0的具体安装 ...

  10. SQL Server中,with as使用介绍

    一.WITH AS的含义      WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候 ...