Python进程线程管理:非阻塞套接字与多任务控制

需积分: 5 0 下载量 73 浏览量 更新于2024-08-05 收藏 3KB MD 举报
"进程线程补充" 在计算机科学中,进程和线程是操作系统中并发执行的基本单位。本文档主要补充了关于进程线程的一些关键知识点,并提供了如何处理阻塞情况、多任务运行控制以及多任务标志的示例。 ### 1. 阻塞与非阻塞以及io多路复用 #### (1) 阻塞与非阻塞套接字 在使用`socket`进行数据传输时,可能会遇到两处阻塞点: 1. 服务端`accept`时,如果客户端尚未`connect`,服务端会一直等待,处于阻塞状态。 2. 当客户端已经连接,但`conn`在等待`recv`数据时,如果客户端没有发送数据,也会阻塞。 #### (2) 解决阻塞的策略 - **非阻塞套接字**:通过`setblocking(False)`设置套接字为非阻塞模式,当遇到阻塞情况时,不会等待而是立即返回错误,通过异常处理机制来处理这种情况。 - **IO多路复用**:如`epoll`,通过`register`注册感兴趣的事件,`events_read`监听事件,当事件发生时调用回调函数,避免单个套接字阻塞整个程序。 - **多进程**:使用`multiprocessing`库,每个进程拥有独立的内存空间,可以并行处理不同的请求,避免阻塞。 - **多线程**:使用`threading`库,尽管线程之间共享内存,但在某些情况下可以提高并发性能,但需注意资源抢占问题。 ### 2. 多任务运行控制 #### (1) 主进程等待子进程结束后再结束 - 使用`join()`方法,例如`p1.join()`,主进程会等待`p1`子进程执行完毕后再继续执行。 #### (2) 主进程结束,子进程强制终止 - 使用`terminate()`方法,例如`p1.terminate()`,主进程可以强制终止子进程,不等待其自然结束。 #### (3) 检查进程状态 - 使用`multiprocessing.current_process()`可以获取当前运行的进程信息。 ### 3. 多任务标志 #### (1) 进程PID - 可以通过`pid`属性获取进程ID,例如`print('beforestart:', p1.pid)`。 #### (2) 线程的`ident` - 线程的唯一标识符可以通过`ident`属性获取,例如`print('beforestart:', t.ident)`。 #### (3) 进程线程名字 - 初始化进程或线程时可以指定名字,例如`p1 = multiprocessing.Process(target=func, args=(1,), name='进程1号')`。 - 运行后可以通过`name`属性查看,或者修改名字,如`p1.name = '进程1号'`。 同样的,线程的命名也类似,可以通过`threading.Thread(target=func, args=(1,), name='线程1号')`实例化并命名线程,之后可使用`t.name`访问或修改。 总结,进程和线程的管理对于实现高效的并发程序至关重要。了解如何处理阻塞、控制任务执行顺序以及标识和监控进程线程是编写并发程序的基础。合理地使用多进程和多线程可以极大地提升程序的执行效率,同时需要注意进程间通信和同步问题,以防止数据竞争和死锁的发生。
2023-05-17 上传