在一个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)

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

       

最新文章

  1. servlet学习笔记_2
  2. 【原】iOS学习之SQLite和CoreData数据库的比较
  3. Android 5.1 open data flow 数据开启流程
  4. JavaScript数据类型(转)
  5. 几种连接不同数据库的ADO.NET字符串
  6. [原创]PostgreSQL Plus Advince Server在 HA环境中一对多的Stream Replication配置(一)
  7. iOS开发——实用篇Swift篇&amp;状态栏操作
  8. J2EE的若干问题
  9. 利用ESLint检查代码质量
  10. 【转载】__name__ == &quot;__main__&quot;: 你认识我么?
  11. Linux驱动技术(四) _异步通知技术
  12. leetcode-1006 Construct Binary Tree from Inorder and Postorder Traversal
  13. Linux使用小笔记&lt;进程操作篇&gt;
  14. XD
  15. [STM32F429-DISCO-HAL]2.先学会点亮LED和使用LCD。。。
  16. Java z 404
  17. Arch Linux VMware虚拟机(新手)安装教程
  18. phpcms中set_config和get_sysinfo函数
  19. 浏览器URL中 encodeURIComponent()加密和decodeURIComponent()解码
  20. div里 datapicker显示异常的情况之一

热门文章

  1. Cocos2d-X开发中国象棋《三》開始场景的实现
  2. AFNetworking 3.0携带參数上传文件Demo
  3. yun install java
  4. TControl的主要功能研究(属性,函数,事件)
  5. Single document interface和Multiple document interface
  6. Python 32 通信循环 连接循环 粘包问题
  7. 3d数学 7 矩阵
  8. 计算某个时间段(2017-10-01 2017-12-01)内svn更新文件的MD5
  9. Elasticsearch之curl删除索引库
  10. 使用curl 上传文件,multipart/form-data