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