python下的线程 进程,以及如何实现并发服务器
在一个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下的线程 进程,以及如何实现并发服务器的更多相关文章
- python笔记9 线程进程 threading多线程模块 GIL锁 multiprocessing多进程模块 同步锁Lock 队列queue IO模型
线程与进程 进程 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要 ...
- Python嫌多(线程/进程)太慢? 嫌Scrapy太麻烦?没事,异步高调走起!——瓜子二手车
基本概念了解: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我 ...
- Python学习笔记(六)多进程实现并发服务器
这个相对于多进程更加简单,每accept一个新的连接就创建一个新的线程.代码如下: # coding: utf-8 import socket import sys import errno impo ...
- Python 中的线程-进程2
原文:https://www.cnblogs.com/i-honey/p/7823587.html Python中实现多线程需要使用到 threading 库,其中每一个 Thread类 的实例控制一 ...
- Python学习之==>线程&&进程
一.什么是线程(thread) 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一个线程指的是进程中一个单一顺序的控制流,一个进程中可以包含多个线程,每条线程并行 ...
- Python 中的线程-进程1
原文:https://www.cnblogs.com/i-honey/p/8042047.html 1. 并行和并发 并行:同时做某些事,可以互不干扰的同一时刻做几件事. 并发:也是同时做某些事,但是 ...
- 人生苦短之我用Python篇(线程/进程、threading模块:全局解释器锁gil/信号量/Event、)
线程: 有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.是一串指令的集合.线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是 ...
- Python学习笔记(五)多进程实现并发服务器
每创建一个TCP连接,就创建一个进程. 代码如下: # coding: utf-8 import socket import os import sys import signal import ...
- python之线程进程协成
线程与进程 什么是线程 线程是进程一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可与同属一个线程的 ...
随机推荐
- cacti安装和第三方模块的导入
Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监測图形分析工具.Cacti是通过 snmpget来获取数据,使用 RRDtool绘绘图形,并且你全然能够不须要了解RRD ...
- powerdesigner 16.5 视图的显示
今天中午为了解说绘图.然后把toolbox跟object brower都关掉了,花了1个小时才找到toolbox 1.object brower显示 直接使用快捷键 ALT+0 2.toolbox(也 ...
- Catalyst 2960 and 2960-S Software -Configuring VTP
http://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst2960/software/release/12-2_53_se/configura ...
- class--类②
定义 C++ 对象 类提供了对象的蓝图,所以基本上,对象是根据类来创建的.声明类的对象,就像声明基本类型的变量一样.下面的语句声明了类 Box 的两个对象: Box Box1; // 声明 Box1, ...
- 关于api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案
关于api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案 目录 关于api-ms-win-crt-runtimel1-1-0dll缺失的解决方案 目录 安装VC redite ...
- fopen文件目录问题
程序当前目录下.如果是在 VC 里面运行的, 这个目录是工程的目录. 如果是双击 exe 运行的, 这个目录就是 exe 所在的目录.
- Squares(枚举+set 查找)
http://poj.org/problem?id=2002 题意:给出n组坐标,判断这些坐标能组成的正方形的个数. 思路:参考某大神的想法,先枚举两个点,然后利用公式表示出另外两个点,判断这两个点是 ...
- Check the difficulty of problems(概率+DP)
http://poj.org/problem?id=2151 看的题解..表示没看懂状态转移方程.. #include<stdio.h> #include<string.h> ...
- Django day05 视图层之 (HttpRequest) \ (HttpResponse) \ (JsonResponse) 对象
一:视图层之HttpRequest对象 # 前台Post传过来的数据,包装到POST字典中 # request.POST # 前台浏览器窗口里携带的数据,包装到GET字典中 # request.GET ...
- HDU3533 Escape
题目: The students of the HEU are maneuvering for their military training. The red army and the blue a ...