进程与线程的标识

知识点一:进程id 与 线程ident

import time
import multiprocessing
import threading
time.sleep(10)
print(multiprocessing.current_process().pid) # 进程 def func():
time.sleep(5) p = threading.Thread(target=func)
p.start()
print(p.ident) # 线程

xshell

ps aux | grep python3

知识点二:进程名 与 线程名

import time
import multiprocessing
import threading def func():
time.sleep(1) p = threading.Thread(target=func, name='李木子')
p.start()
print(p)
print(p.name) print('- - ' *20)
p.name = '李希'
print(p)

知识点三:获取当前线程/进程信息

提示!
可以在任何一个进程或者线程里搞清楚自己是谁

import time
import multiprocessing
print(multiprocessing.current_process()) # 获取主进程中的当前进程对象 def fun():
print("- - "*10)
print(multiprocessing.current_process()) # 获取子进程中的当前进程对象 p = multiprocessing.Process(target=fun, name='李希一号')
print(p)
p.start()

进程与线程的其余相关操作

知识点一:等待结束

等待进程或线程结束

提示!进程和线程是一样的同学们课后自己尝试

import time
import multiprocessing print("外层start", time.asctime()) def func():
print("里层start", time.asctime())
time.sleep(5)
print("里层end", time.asctime())
p = multiprocessing.Process(target=func)
p.start()
time.sleep(5)
print("外层end", time.asctime())

可以看到,并行结果,主子同时进行

加上join,等待子进程结束,再执行主进程

import time
import multiprocessing print("外层start", time.asctime()) def func():
print("里层start", time.asctime())
time.sleep(5)
print("里层end", time.asctime())
p = multiprocessing.Process(target=func)
p.start() p.join() # 主进程 等待子进程结束 time.sleep(5)
print("外层end", time.asctime())

中止进程

注意!线程并不能被中途中止只能等待其运行结束

import time
import multiprocessing
print(multiprocessing.current_process()) def fun():
print("里层start", time.asctime())
time.sleep(5)
print("里层end", time.asctime()) p = multiprocessing.Process(target=fun, name='李希一号')
p.start()
time.sleep(2)
p.terminate() # 不管你执行多久,同时结束主进行和子进程

进程与线程的生存与状态

import time
import multiprocessing def func():
time.sleep(5) p = multiprocessing.Process(target=func, name='李木子')
print(p)
print("状态:",p.is_alive()) p.start()
print(p)
print("状态:",p.is_alive())

守护模式

提示!多线程中的守护线程与守护进程类似

通俗的讲,皇帝死后(主进程),妃子陪葬(子进程)

import time
import multiprocessing def func():
print('start')
time.sleep(5)
print('end') p = multiprocessing.Process(target=func, daemon=True) # 设置守护进程
p.start()
time.sleep(2)

以面向对象的形式使用进程与线程

面向对象使用线程/进程
步骤一: 继承 Process或Thread 类
步骤二: 重写 __init__方法
步骤三: 重写 run方法

import time
import multiprocessing class MyProcess(multiprocessing.Process): def __init__(self, *args, **kwargs):
super().__init__() # super重写
self.args = args
self.kwargs = kwargs def run(self):
print('我是重写的')
print(multiprocessing.current_process()) # 子进程的当前进程对象
print(self.args)
print(self.kwargs) print(multiprocessing.current_process()) # 主进程的当前进程对象
p = MyProcess(1, 2, 3, a=1, b=2) # 实例化
p.start()

面向对象使用的思路

用面向对象的方式来实现多线程并发服务器
import time
import socket
import threading server = socket.socket()
server.bind(('0.0.0.0', 8888))
server.listen() class MyThread(threading.Thread): def __init__(self, conn):
super().__init__() # super重写
self.conn = conn
print(self.conn) def run(self):
while True:
data = self.conn.recv(1024) if data == b'':
self.conn.close()
break
else:
print("接收到的消息: {}".format(data.decode()))
self.conn.send(data) while True:
conn, addr = server.accept()
print("{}正在连接".format(addr)) p = MyThread(conn) # 实例化
p.start()

客户端:

import socket

click = socket.socket()
click.connect(('127.0.0.1', 8888)) while True:
data = input("请输入你要发送的数据:")
click.send(data.encode())
print("接收到的消息: {}".format(click.recv(1024).decode()))

总结完毕!

作者:含笑半步颠√

博客链接:https://www.cnblogs.com/lixy-88428977

声明:本文为博主学习感悟总结,水平有限,如果不当,欢迎指正。如果您认为还不错,欢迎转载。转载与引用请注明作者及出处。

最新文章

  1. Mac制作U盘系统(OS X El Capitan)教程
  2. startActivity跳转失败而且没有异常信息
  3. ThinkPHP常用变量
  4. 快速的搭建JFinal的ORM框架示例
  5. 测试驱动开发实践 - Test-Driven Development
  6. HTML邮件制作规范
  7. android开发无障碍app
  8. C# 启动和结束一个线程
  9. Css3动态伪类
  10. Oracle EBS-SQL (WIP-6):检查任务已完成但状态是发放的任务.sql
  11. 知识普及:iOS7搭载新定位技术iBeacon
  12. TBDR缺点
  13. 在Eclipse中用TODO标签管理任务(Task)
  14. link js重构心得
  15. Qt之QComboBox定制(二)
  16. 18.14 构建Linux根文件系统
  17. 【gdoi2018 day2】第二题 滑稽子图
  18. LeetCode 748 Shortest Completing Word 解题报告
  19. centos7 install rabbtimq
  20. oracle-sql模式匹配

热门文章

  1. shell中的字符串操作——字符串的切割
  2. 第08组 Alpha冲刺(2/6)
  3. Fluent Meshing生成空心球体网格(空心部分不生成网格)
  4. Spring中@Bean与@Configuration
  5. Django实现自动发布(2视图-服务管理)
  6. php如何实现三级分销
  7. Oracle 如何恢复删除并提交的表数据
  8. spring的multipartResolver和java后端获取的MultipartHttpServletRequest方法对比
  9. (转)2019年 React 新手学习指南 – 从 React 学习线路图说开去
  10. docker使用redis.conf配置文件方式启动redis无反应无日志