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调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可与同属一个线程的 ...
随机推荐
- 2014百度之星第二题Disk Schedule(双调欧几里得旅行商问题+DP)
Disk Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- 【Linux】Linux下配置apache
一.获取软件: http://httpd.apache.org/ httpd-2.4.10.tar.gz 二.安装步骤: 解压源文件: 1) tar zvxf httpd-2.4.10.tar. ...
- Microsoft ASP.NET SignalR
SignalR类似与JavaScript实时框架,如Socket.IO.SignalR能够完成客户端向服务器的异步通信,并同时支持服务器向浏览器客户端推送事件.SignalR的连接通过日益流行的Web ...
- 【BZOJ 1230】 开关灯
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1230 [算法] 线段树 [代码] #include<bits/stdc++.h ...
- bzoj 1029 [ JSOI 2007 ] 建筑抢修 —— 贪心
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1029 想不出来贪心... 首先把任务按结束时间排序: 因为任务一定是越提前做越好,所以从头开 ...
- Shredding Company(dfs)
http://poj.org/problem?id=1416 题意:将一个数分成几部分,使其分割的各个数的和最大并且小于所给的数. 凌乱了..参考的会神的代码..orz... #include < ...
- android平台 cocos2d-x 读取相册数据
现已解决 方案如下: 1.使用 jni 调用 java 方法 启动相册选择框2.使用java将获取的图片保存到本地3.使用Cocos2d-x中 CCImage 读取 JAVA代码如下: //启动图片选 ...
- 简单ajax库
function TuziAjax(reqType,url,fnoK, fnFail) { var xmlHttp = null; if (window.XMLHttpRequest) { xmlHt ...
- Visual C++6.0的下载与安装
1.Visual C++6.0的下载 本书中使用的Visual C++6.0的中文版,读者可以在网上搜索,下载合适的安装包. 2.Visual C++6.0的安装 Visual C++6.0的具体安装 ...
- SQL Server中,with as使用介绍
一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候 ...