Python3之进程、线程

进程

什么是进程

正在进行中或者正在处理任务的程序,比如运行中的QQ,正在播放音乐的酷我,都是进程,进程有优先级

进程与程序的区别

进程

指正在处理任务或者正在进行中的程序。
一个程序启动两次属于2个进程

程序

指在硬盘中没有被执行的程序文件

并发与并行

并发:

单核条件下,正在运行中的多个程序,CPU被操作系统调度,对遇到I/O操作和运行时间足够长的程序进行切换,并且在切换过程中对上次执行的结果保存在操作系统内存中,以便CPU回切执行程序时从上次结束的位置继续。

并行:

多核条件下,每个CPU对应一个任务进行处理

同步与异步

同步:

两个进程间的通信,好比两个人打电话,必须都在才行

异步:

一个进程的数据发到第三方,另一个进程从第三方去获取。类似发短信,一个人发送短信到电信公司,由电信公司转交,但接收方不一定在,时间上不固定

进程的层次结构

Linux系统

父进程和子进程的关系, 子类会全部拷贝父类的初始状态,只限父子之间的拷贝,并且是初始状态

Windows系统

一个进程在执行过程中产生新的进程,没有继承父类的任何东西,并且是两个完全独立的进程

进程并发的实现

代码实现

服务端
import socket
from multiprocessing import Process

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1', 8080))
s.listen(5)


class Communicate(Process):
    def __init__(self, conn):
        super().__init__()
        self.conn = conn

    def run(self):
        while 1:
            try:

                data = self.conn.recv(1024)
                if not data: break
                self.conn.send(data.upper())
            except Exception:
                break
        self.conn.close()
#
# def communicate(conn, addr):
#     while 1:
#         try:
#
#             data = conn.recv(1024)
#             if not data: break
#             conn.send(data.upper())
#         except Exception:
#             break
#     conn.close()


if __name__ == '__main__':

    while 1:
        conn, addr = s.accept()
        # p = Process(target=communicate, args=(conn, addr))
        # p.start()
        p = Comunicate(conn)
        p.start()

    s.close()
客户端
import socket

c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
c.connect(('127.0.0.1',8080))

while 1:
    msg = input('>>:').strip()
    if not msg:continue
    c.send(msg.encode('utf-8'))
    data = c.recv(1024)
    print(data.decode('utf-8'))
c.close()

代码解读

创建一个类Communicate继承Process,实现run方法:

class Communicate(Process):
    def __init__(self, conn):
        super().__init__()
        self.conn = conn

    def run(self):
        while 1:
            try:
                data = self.conn.recv(1024)
                if not data: break
                self.conn.send(data.upper())
            except Exception:
                break
        self.conn.close()

当实例化对象时调用start()会触发run方法去执行任务也就是内部代码:

p = Comunicate(conn)
p.start()

Windows系统下创建子进程必须放到这个条件下:

if __name__ == '__main__':

原因如下:

Since Windows has no fork, the multiprocessing module starts a new Python process and imports the calling module. If Process() gets called upon import, then this sets off an infinite succession of new processes (or until your machine runs out of resources).This is the reason for hiding calls to Process() inside.if name == “main” since statements inside this if-statement will not get called upon import.

线程

待续~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值