并发编程—进程与程序,并发与并行,开启进程的两种方式,多进程实现简单的并发通信

进程与程序的区别

进程指的是正在执行的一个过程,是对正在进行程序的抽象概念。
程序仅仅是一堆代码而已。

多道技术

多道指的是多个程序,多道技术解决的是多个程序共用一个cpu的调度问题。一个cpu一次只能执行一个任务,执行任务过程中,如果执行时需要操作硬盘,那cpu等待的时间就比较长,这时可以让cpu去切换做其他的任务。
多道技术就是将内存分为几个部分,放不同的程序,当一个程序执行时间过长或者在等待 I/O时切换cpu做其他的任务,切换时间较短,所以看起来好像是多个程序同时运行了。

并发与并行的区别

并发是单个cpu+多道技术实现的并发,看起来是同时运行,实际上是伪并行。
并行是多个cpu,每个都可以用多道技术实现的同时运行。

开启进程的两种方式

用到的模块:multiprocessing

方式一:定义好需执行的函数,实例化Process对象时调用函数

from multiprocessing import Process
import time

def run(name):  # 定义了run函数
    print('%s is running' % name)
    time.sleep(3)



if __name__ == '__main__':  # windows 中Process() 必须放到下面!
    p1 = Process(target=run, args=('小明',))  # target 表示调用要执行的任务,args传参,元祖形式,单个参数必须加逗号,('小明',)
    p2 = Process(target=run, args=('小红',))

    p1.start()  # 调用start方法
    p2.start()

    print('主进程')
    
# 执行结果:说明主程序要创建子进程时给操作系统发了信号之后,就继续执行了,并没有等待子进程执行完毕,而子进程创建时也并非等一个执行完才创建另一个。

主进程
小明 is running
小红 is running

方法二:自定义类,继承Process,自定义方法,实例化对象调用方法

class MyProcess(Process):  # 继承类Process
    def __init__(self, name):
        super().__init__()  # 继承父类方法
        self.name = name

    def run(self):  # 必须是run方法,start才能调用,不然不执行
        print('%s is running' % self.name, os.getpid(), os.getppid())  # 查看子进程和父进程
        time.sleep(3)
        print('%s is done' % self.name)


if __name__ == '__main__':
    p1 = MyProcess('小明')
    p2 = MyProcess('小红')
    p1.start()
    p2.start()
    print('主进程序', os.getpid(), os.getppid())  # 当前程序的运行id,和当前软件的id (pycharm的进程号)



主进程序 12276 54868
小明 is running 40688 12276
小红 is running 35852 12276
小红 is done小明 is done

进程之间内存隔离

进程之间内存隔离:

n = 100
def test():
    global n
    n = 0
    print('子进程', n)

if __name__ == '__main__':
    p1 = Process(target=test)
    p1.start()
    p1.join()
    print('主进程', n)
   
 # 子进程 0
# 主进程 100

多进程实现简单的并发通信

服务端
import socket
from multiprocessing import Process


def connect(conn):
    while True:
        try:
            data = conn.recv(1024)
            conn.send(data.upper())
        except ConnectionResetError:
            break

    conn.close()

def server():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(('127.0.0.1', 8080))
    server.listen(5)
    while True:
        # 服务端要做两个活,建立连接,开启子进程去通信。
        conn, addr = server.accept()
        c1 = Process(target=connect, args=(conn,))
        c1.start()
    server.close()


if __name__ == '__main__':
    server()
客户端

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

while True:
    msg = input(':').strip()
    if not msg: continue
    client.send(msg.encode('utf-8'))
    data = client.recv(1024)
    print(data.decode('utf-8'))

client.close()

猜你喜欢

转载自blog.csdn.net/Light__1024/article/details/86484120