在一个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. oc51--循环retain

    // main.m // 循环retain #import <Foundation/Foundation.h> #import "Person.h" #import & ...

  2. bzoj2503 相框——思路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2503 思路题: 首先,这种问题应该注意到答案只跟度数有关,跟其他什么连接方法之类的完全无关: ...

  3. Python 32 通信循环 连接循环 粘包问题

    一:通信循环 二:连接循环 三:粘包问题

  4. [DP专题]悬线法

    参考:https://blog.csdn.net/twtsa/article/details/8120269 先给出题目来源:(洛谷) 1.p1387 最大正方形 2.P1169 棋盘制作 3.p27 ...

  5. indeed 4.22 第一次网测

    1.第一题 没有看 2. 由于数据范围很小,所以每一层需要全排列,寻找最小的花费,然后所有层加起来就是最后的结果. #include<bits/stdc++.h> #define pb p ...

  6. Halcon学习笔记之支持向量机(一)

    例程:class_overlap_svm.hdev 说明:这个例程展示了如何用一个支持向量机来给一幅二维的图像进行分类.使用二维数据的原因是因为它可以很容易地联想成为区域和图像.本例程中使用了三个互相 ...

  7. Java多线程-synchronized关键字

    进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行. 一个进程中至少有一个线程 Ja ...

  8. electron 学习

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  9. Percona Xtrabackup对数据库进行部分备份

    Xtrabackup也可以实现部分备份,即只备份某个或某些指定的数据库或某数据库中的某个或某些表.但要使用此功能,必须启用innodb_file_per_table选项,即每张表保存为一个独立的文件. ...

  10. Visual Studio Code 插件推荐

    Path Intellisense - 路径补全 HTML Snippets - HTML 标记增强 Markdown+Math - Markdown 增强(数学表达式) vscode-icons - ...