线程,进程,是实现并发的方法,
并行:
在同一时刻,同时运行多个任务,CPU 的数量大于等于任务数量,
并发:
在同一时间间隔内, 同时处理多个任务,
并行是并发。
进程:表示一个正在执行的程序,
操作系统负责其上所有的执行
多进程
import multiprocessing # from multiprocessing import process import time # 模拟一个好使任务 print('a:',time.asctime(time.localtime(time.time()))) def func(): print('b:',time.asctime(time.localtime(time.time()))) time.sleep(5) print('c:',time.asctime(time.localtime(time.time()))) # 进程实例 Process( target=func ,args=) p = multiprocessing.Process( target=func ) p.start() # 启动 time.sleep(5) print('d:',time.asctime(time.localtime(time.time()))) # 相当于两个 time.sleep(5) 同时运行
多个进程:
for i in range(30):
p = multiprocessing.Process( target=func )
p.start()
多进程并行的必要条件:
总进程数理不多于 CPU 核心数量
所以,现在运行的程序都是轮询调度产生的,
但在 python 层面的确获得了并行,
多线程实现并发:
线程,是执行的最小单元 ,多线程:是一个进程 中同时开户多个线程,线程可以被中断,也可以被挂起
GIL锁,在 python 里,一个进程一次只能有一个线程运行,
进程:进程当中最少有一个线程,是操作系统分配资源的基本单位,
线程:
# import multiprocessing # 进程 from threading import Thread # 线程对象 import time # 模拟一个好使任务 print('a:',time.asctime(time.localtime(time.time()))) def func(): print('b:',time.asctime(time.localtime(time.time()))) time.sleep(5) print('c:',time.asctime(time.localtime(time.time()))) # 进程实例 Process( target=func ,args=) p = Thread( target=func ) p.start() # 启动 time.sleep(5) print('d:',time.asctime(time.localtime(time.time()))) # 相当于两个 time.sleep(5) 同时运行
当线程遇到阻塞,睡眠,就会切换运行
在 linux 中
import os,time pid = os.fork() # 只要执行这个方法,就会COPY一个新的进程 if pid == 0: print('子进程',pid) # 永远是 0 else:print('父进程 ',pid) # 返回的是子进程的 pid 值, time.sleep(0.1)
因为两个进程都执行,同时两个成立,
多进程实现并发
# 多进程实现并发, from socket import * from multiprocessing import Process server = socket() server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 重用端口 server.bind(('127.0.0.1', 10001)) server.listen(5) def fun(conn): while True: try: r = conn.recv(1024) if not r: break conn.send(r) except Exception: break if __name__ == '__main__': # windows下 while True: conn, addr = server.accept() p = Process(target=fun, args=(conn,)) p.start()
多线程实现并发
# 多进程实现并发, from socket import * from threading import Thread server = socket() server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 重用端口 server.bind(('127.0.0.1', 10001)) server.listen(5) def fun(conn): while True: try: r = conn.recv(1024) if not r: break conn.send(r) except Exception: break if __name__ == '__main__': # windows下 while True: conn, addr = server.accept() p = Thread(target=fun, args=(conn,)) p.start()