from multiprocessing import Process
import time
def task(name):
print(f"{name} is running")
time.sleep(3)
print(f"{name} is gone")
if __name__ == '__main__':
p = Process(target=task,args=("alex",)) # 指定 这个线程去哪个函数里面去执行代码
p.start() #只是向操作系统发出一个开辟子进程的信号(由cpu执行进程中额任务),然后就执行下一行了
print("__main__")
#操作系统在接受到信号之后,会在内存中开辟一个进程空间(新建一个子进程py文件),然后将主进程所有数据copy到子进程(相当于在子进程py文件中import主进程的所有内容,那么if __name__ == "__main__"下面的不会导过来),然后调用线程执行。
#开辟子进程的开销很大(时间很长),所以永远会执行主进程的代码。
from multiprocessing import Process
import time
class MyProcess(Process):
def run(self):
print(f"{self.name} is running")
time.sleep(3)
print(f"{self.name} is end")
if __name__ == '__main__':
p = MyProcess()
p.start() # 会自动执行run方法(run方法相当于上面的task函数)
print("__main__")
#Process类中有name属性,默认为类名加上-1(MyProcess-1),每次新建一个子进程就MyProcess-2、MyProcess-3...
from multiprocessing import Process
import time
import os
def task(name):
print(f'子进程:{os.getpid()}')
print(f'主进程:{os.getppid()}')
if __name__ == '__main__':
p = Process(target=task,args=('常鑫',)) # 创建一个进程对象
p.start()
# print('==主开始')
print(f'====主{os.getpid()}')
from multiprocessing import Process
import time
name = '太白'
def task():
global name
name = '刚子sb'
print(f'子进程{name}')
if __name__ == '__main__':
p = Process(target=task) # 创建一个进程对象
p.start()
time.sleep(3)
print(f'主:{name}')
#打印结果
#子进程刚子sb
#主:太白
from multiprocessing import Process
import time
def task1(name):
print(f"{name} is running")
time.sleep(1)
print(f"{name} is gone")
def task2(name):
print(f"{name} is running")
time.sleep(2)
print(f"{name} is gone")
def task3(name):
print(f"{name} is running")
time.sleep(3)
print(f"{name} is gone")
if __name__ == '__main__':
start_time = time.time()
p1 = Process(target=task1,args=("alex",))
p2 = Process(target=task2,args=('egon',))
p3 = Process(target=task3,args=('meet',))
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
p3.join()
print(time.time() - start_time)
打印结果
alex is running
egon is running
meet is running
alex is gone
egon is gone
meet is gone
3.101801872253418
#我们看到,只执行了3s左右,因为p1.start(),p2.start(),p3.start()三个相当于并发执行,p1.join()执行的过程中p2,p3也会执行,其实就是并发。
from multiprocessing import Process
import time
def task1(name):
print(f"{name} is running")
time.sleep(1)
print(f"{name} is gone")
def task2(name):
print(f"{name} is running")
time.sleep(2)
print(f"{name} is gone")
def task3(name):
print(f"{name} is running")
time.sleep(3)
print(f"{name} is gone")
if __name__ == '__main__':
start_time = time.time()
p1 = Process(target=task1,args=("alex",))
p2 = Process(target=task2,args=('egon',))
p3 = Process(target=task3,args=('meet',))
p1.start()
p2.start()
p3.start()
p1.join()
print("p1")
p2.join()
print("p2")
p3.join()
print("p3")
print(time.time() - start_time)
打印结果:
alex is running
egon is running
meet is running
alex is gone
p1 #1s执行打印p1
egon is gone
p2 #第2s执行打印p2,因为p2已经执行了1s
meet is gone
p3
3.1154708862304688
from multiprocessing import Process
import time,random
def task():
print("task begin")
time.sleep(random.randint(1,2))
print("task end")
if __name__ == '__main__':
start_time = time.time()
for i in range(3):
p = Process(target=task)
p.start()
p.join()
print("__main__")
print(time.time() - start_time)
# 上述例子为串行,每start()一次,就join一次,我们都知道,有join会等到join完成后再执行下面的代码。正确例子如下:
from multiprocessing import Process
import time,random
def task():
print("task begin")
time.sleep(random.randint(1,2))
print("task end")
if __name__ == '__main__':
start_time = time.time()
lst = []
for i in range(3):
p = Process(target=task)
lst.append(p)
p.start()
for j in lst:
j.join()
print("__main__")
print(time.time() - start_time)
from multiprocessing import Process
import time
def task(name):
print(f'{name} is running')
time.sleep(2)
print(f'{name} is gone')
if __name__ == '__main__':
p = Process(target=task,args=('常鑫',)) # 创建一个进程对象
p.daemon = True # 将p子进程设置成守护进程,只要主进程结束,守护进程马上结束(print('===主')一打印完,主进程中没有要执行的任务了,守护进程就死掉)
p.start()
time.sleep(1)
print('===主')
from multiprocessing import Process
from multiprocessing import Lock
import json
import time
import os
import random
def search():
time.sleep(random.randint(1,3)) # 模拟网络延迟(查询环节)
with open('ticket.json',encoding='utf-8') as f1:
dic = json.load(f1)
print(f'{os.getpid()} 查看了票数,剩余{dic["count"]}')
def paid():
with open('ticket.json', encoding='utf-8') as f1:
dic = json.load(f1)
if dic['count'] > 0:
dic['count'] -= 1
time.sleep(random.randint(1,3)) # 模拟网络延迟(购买环节)
with open('ticket.json', encoding='utf-8',mode='w') as f1:
json.dump(dic,f1)
print(f'{os.getpid()} 购买成功')
def task(lock):
search()
lock.acquire()
paid()
lock.release()
if __name__ == '__main__':
mutex = Lock()
for i in range(6):
p = Process(target=task,args=(mutex,))
p.start()