Python中多进程深入解析(2)

if __name__ == '__main__':  # windows下开启进程的指令需要放在main下面
    p = Process(target=task,args=('子进程1',))  # target代表去执行一个任务,如果是加括号的话相当于立马就执行了
    p.start()
    print('主进程')
   
# 运行结果如下:
主进程
子进程1 is running
子进程1 is done

# 开启进程的第二种方式
from multiprocessing import Process
import time

class MyProcess(Process):  # 定制自己的方法
    def __init__(self,name):
        super(MyProcess, self).__init__()  # 重写父类方法
        self.name = name

def run(self):  # 这里一定要用run
        print('%s is running'%self.name)
        time.sleep(2)
        print('%s is done'%self.name)

if __name__ == '__main__':
    # 实例化4个对象
    p1 = MyProcess('子进程1')
    p2 = MyProcess('子进程2')

p1.start()  # 会自动调用run方法
    p2.start()
    print('主进程')  # 首先第一步肯定是先打印出这句话
   
# 运行结果为:
主进程
子进程2 is running
子进程1 is running
子进程2 is done
子进程1 is done

我们看到子进程2先运行了,那么程序应该是从上到下执行,先执行子进程1然后再执行子进程2才对呀,这个我们是不可以控制谁先执行谁后执行的,因为启动的速度太快了,等到后面我可以教你如何先启动子进程1再启动子进程2的

刚在上面说到,创建子进程的时候,会把父进程/主进程的数据复制一份作为子进程的初始数据,但进程之间的数据是共享的还是隔离的呢?让我们来证明一下:

from multiprocessing import Process
import time

num = 100  # 定义一个全局变量,是属于主进程的
def task():
    global num
    num = 10
    print('子进程中n的值为:',num)

if __name__ == '__main__':
    p1 = Process(target=task)
    p1.start()
    print('主进程中N的值为:',num)
   
# 运行结果如下:
主进程中N的值为: 100
子进程中n的值为: 10

那么经过这一段代码就可以证明,进程之间的数据是不共享的

现在让我们来尝试一下:基于多进程并发实现的套接字通信,但是首先我会将套接字通信给先写出来,就算给大家复习了:

#!/usr/bin/Python3

# socket客户端
import socket
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()
print('starting......')

conn,addr = server.accept()
print(addr)

while True:
    try:
        data = conn.recv(1024)
        print('客户端的数据:',data)
        conn.send(data.upper())
    except ConnectionResetError:
        break
conn.close()
server.close()

#!/usr/bin/python3

# socket客户端
import socket
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()

在 以上这段代码中,服务端开放8080端口用于socket通信,客户端连接本地8080端口实现通信,但是这段代码中有一个很明显的缺陷就是:服务端一次只能和一个客户端进行连接,试换到web服务器上,一个客户端1过来连接了,那么下一个客户端2一直要等到这个客户端1连接分手之后才可以进行连接吗?答案肯定不是这样的,我们之前说过,一个程序运行两次就是两个进程,所以这个代码我们需要使用多进程改写:

#!/usr/bin/python3

# socket客户端
import socket
from multiprocessing import Process

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/942b8ff73ff4d41252705a0d573d82eb.html