day 36 process模块的join、pid、name、is_alive、terminate方法,守护进程,抢票程序

process的join法

from multiprocessing import Process
import time
def foo():
print('进程 start ')
time.sleep(2.3)
print('进程 end ')

if __name__ == '__main__':
p = Process(target=foo)
p.start() #
# 核心需求就是
# time.sleep(5)
p.join() # 阻塞住主进程再等待子进程结束,然后再往下执行,(了解的是:内部会待用wait())
print('主')


from multiprocessing import Process
import time
def foo(x):
print('进程 start ')
time.sleep(x)
print('进程 end ')



if __name__ == '__main__':
p1 = Process(target=foo,args=(1,))
p2 = Process(target=foo,args=(2,))
p3 = Process(target=foo,args=(3,))
start = time.time()
p1.start() #
p2.start() #
p3.start() #
# 核心需求就是
# time.sleep(5)
p3.join() #1s
p1.join() #1s
p2.join() #1s
# 总时长:按照最长的时间计算多一点。
end = time.time()
print(end-start) #3s多 or 6s多 ? 正解:3s多
print('主')


from multiprocessing import Process
import time
def foo(x):
print(f'进程{x} start ')
time.sleep(x)
print(f'进程{x} end ')



if __name__ == '__main__':
p1 = Process(target=foo,args=(1,))
p2 = Process(target=foo,args=(2,))
p3 = Process(target=foo,args=(3,))
start = time.time()
p1.start()
p1.join()
p2.start()
p2.join()
p3.start()
p3.join()
# 相当于串行,不如不开,直接穿行调用函数反而快
end = time.time()
print(end-start)
print('主')


process的pid用法
from multiprocessing import Process,current_process
import time,os

def task():

print('子进程 start')
print('在子进程中查看自己的pid',current_process().pid) # 在子进程中查看自己的pid
print('在子进程中查看父进程的pid',os.getppid()) #
time.sleep(200)
print('子进程 end')

if __name__ == '__main__':

p = Process(target=task)
p.start()
print('在主进程查看子进程的pid',p.pid) # 一定要写在 start()之后
print('主进程的pid',os.getpid())
print('主进程的父进程pid',os.getppid())
print('主')

# 记住这些就ok了 这个是要掌握的
# 角度 站在当前进程的角度
os.getpid()#获取当前进程的pid
os.getppid() #获取当前进程的父进程的pid
子进程对象.pid #获取当前进程的子进程pid


process的name和is_alive用法
from  multiprocessing import Process,current_process
import time
def foo():
print('进程 start')
# print('--------------------- ',current_process().name)
time.sleep(2)
print('进程 end')


if __name__ == '__main__':
p = Process(target=foo)
# p2 = Process(target=foo)
# p3 = Process(target=foo,name='rocky')

p.start()
# p2.start()
# p3.start()
print(p.is_alive()) # True
time.sleep(5)
print(p.is_alive()) # 代码运行完了就算死了 False
# print(p.name)
# print(p2.name)
# print(p3.name)
print('主')


process的terminate用法
from  multiprocessing import Process,current_process
import time
def foo():
print('进程 start')
time.sleep(50)
print('进程 end')


if __name__ == '__main__':
p = Process(target=foo)


p.start()
p.terminate() # 给操作系统发了一个请求
print(p.is_alive()) # True
p.join()
print(p.is_alive()) # False
print('主')


 
 
守护进程
'''
守护进程
守护--》伴随
本质也是一个子进程
主进程的代码执行完毕守护进程直接结束。
'''

from multiprocessing import Process
import time
def foo():
print('守护进程 start')
time.sleep(3)
print('守护进程 end')

def task():
print('子进程 start')
time.sleep(5)
print('子进程 end')


if __name__ == '__main__':
p = Process(target=foo)
p2 = Process(target=task)
p.daemon = True # 把这个子进程定义为了守护进程
p.start()
p2.start()
time.sleep(1)
print('主')


模拟抢票小程序

from  multiprocessing import Process
import json,time,os

def search():
time.sleep(1) # 模拟网络io
with open('db.txt',mode='rt',encoding='utf-8') as f:
res = json.load(f)
print(f'还剩{res["count"]}')

def get():
with open('db.txt',mode='rt',encoding='utf-8') as f:
res = json.load(f)
# print(f'还剩{res["count"]}')
time.sleep(1) # 模拟网络io
if res['count'] > 0:
res['count'] -= 1
with open('db.txt',mode='wt',encoding='utf-8') as f:
json.dump(res,f)
time.sleep(1.5) # 模拟网络io
print(f'进程{os.getpid()} 抢票成功')
else:
print('票已经售空啦!!!!!!!!!!!')

def task():
search()
get()

if __name__ == '__main__':
for i in range(15):
p = Process(target=task)
p.start()
p.join()


# 为了保证数据的安全,要牺牲掉效率.以此例来说,一次只能进行一次抢票进程
 



 

转载于:https://www.cnblogs.com/wwei4332/p/11513006.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import time import multiprocessing from proxypool.processors.server import app from proxypool.processors.getter import Getter from proxypool.processors.tester import Tester from proxypool.setting import CYCLE_GETTER, CYCLE_TESTER, API_HOST, API_THREADED, API_PORT, ENABLE_SERVER, \ ENABLE_GETTER, ENABLE_TESTER, IS_WINDOWS from loguru import logger if IS_WINDOWS: multiprocessing.freeze_support() tester_process, getter_process, server_process = None, None, None class Scheduler(): def run_tester(self, cycle=CYCLE_TESTER): if not ENABLE_TESTER: logger.info('tester not enabled, exit') return tester = Tester() loop = 0 while True: logger.debug(f'tester loop {loop} start...') tester.run() loop += 1 time.sleep(cycle) # CYCLE_GETTER=100 def run_getter(self, cycle=CYCLE_GETTER): if not ENABLE_GETTER: logger.info('getter not enabled, exit') return getter = Getter() loop = 0 while True: logger.debug(f'getter loop {loop} start...') getter.run() loop += 1 time.sleep(cycle) def run_server(self): if not ENABLE_SERVER: logger.info('server not enabled, exit') return app.run(host=API_HOST, port=API_PORT, threaded=API_THREADED) def run(self): global tester_process, getter_process, server_process try: logger.info('starting proxypool...') if ENABLE_TESTER: tester_process = multiprocessing.Process(target=self.run_tester) logger.info(f'starting tester, pid {tester_process.pid}...') tester_process.start() if ENABLE_GETTER: getter_process = multiprocessing.Process(target=self.run_getter) logger.info(f'starting getter, pid{getter_process.pid}...') getter_process.start() if ENABLE_SERVER: server_process = multiprocessing.Process(target=self.run_server) logger.info(f'starting server, pid{server_process.pid}...') server_process.start() tester_process.join() getter_process.join() server_process.join() except KeyboardInterrupt: logger.info('received keyboard interrupt signal') tester_process.terminate() getter_process.terminate() server_process.terminate() finally: # must call join method before calling is_alive tester_process.join() getter_process.join() server_process.join() logger.info(f'tester is {"alive" if tester_process.is_alive() else "dead"}') logger.info(f'getter is {"alive" if getter_process.is_alive() else "dead"}') logger.info(f'server is {"alive" if server_process.is_alive() else "dead"}') logger.info('proxy terminated') if name == 'main': scheduler = Scheduler() scheduler.run()给这段代码加注释
06-09
这段代码是一个代理池的调度程序,用于获取代理IP并测试其可用性。下面是对代码的详细注释: ```python import time import multiprocessing from proxypool.processors.server import app # 导入 server 模块 from proxypool.processors.getter import Getter # 导入 getter 模块 from proxypool.processors.tester import Tester # 导入 tester 模块 from proxypool.setting import CYCLE_GETTER, CYCLE_TESTER, API_HOST, API_THREADED, API_PORT, ENABLE_SERVER, ENABLE_GETTER, ENABLE_TESTER, IS_WINDOWS # 导入配置文件 from loguru import logger # 导入日志库 if IS_WINDOWS: multiprocessing.freeze_support() # Windows 平台需要调用这个函数 tester_process, getter_process, server_process = None, None, None # 定义进程对象 class Scheduler(): def run_tester(self, cycle=CYCLE_TESTER): # 定义 tester 进程的运行函数 if not ENABLE_TESTER: # 若不需要测试,则直接退出 logger.info('tester not enabled, exit') return tester = Tester() loop = 0 while True: logger.debug(f'tester loop {loop} start...') tester.run() # 运行 tester loop += 1 time.sleep(cycle) # 循环周期 def run_getter(self, cycle=CYCLE_GETTER): # 定义 getter 进程的运行函数 if not ENABLE_GETTER: # 若不需要获取,则直接退出 logger.info('getter not enabled, exit') return getter = Getter() loop = 0 while True: logger.debug(f'getter loop {loop} start...') getter.run() # 运行 getter loop += 1 time.sleep(cycle) # 循环周期 def run_server(self): # 定义 server 进程的运行函数 if not ENABLE_SERVER: # 若不需要启动 server,则直接退出 logger.info('server not enabled, exit') return app.run(host=API_HOST, port=API_PORT, threaded=API_THREADED) # 运行 server def run(self): # 定义调度程序的运行函数 global tester_process, getter_process, server_process # 定义全局变量 try: logger.info('starting proxypool...') if ENABLE_TESTER: # 若需要测试,则启动 tester 进程 tester_process = multiprocessing.Process(target=self.run_tester) logger.info(f'starting tester, pid {tester_process.pid}...') tester_process.start() if ENABLE_GETTER: # 若需要获取,则启动 getter 进程 getter_process = multiprocessing.Process(target=self.run_getter) logger.info(f'starting getter, pid{getter_process.pid}...') getter_process.start() if ENABLE_SERVER: # 若需要启动 server,则启动 server 进程 server_process = multiprocessing.Process(target=self.run_server) logger.info(f'starting server, pid{server_process.pid}...') server_process.start() tester_process.join() # 等待 tester 进程结束 getter_process.join() # 等待 getter 进程结束 server_process.join() # 等待 server 进程结束 except KeyboardInterrupt: # 捕获键盘中断信号 logger.info('received keyboard interrupt signal') tester_process.terminate() # 终止 tester 进程 getter_process.terminate() # 终止 getter 进程 server_process.terminate() # 终止 server 进程 finally: # 无论如何都要关闭进程 tester_process.join() # 等待 tester 进程结束 getter_process.join() # 等待 getter 进程结束 server_process.join() # 等待 server 进程结束 logger.info(f'tester is {"alive" if tester_process.is_alive() else "dead"}') logger.info(f'getter is {"alive" if getter_process.is_alive() else "dead"}') logger.info(f'server is {"alive" if server_process.is_alive() else "dead"}') logger.info('proxy terminated') if __name__ == '__main__': scheduler = Scheduler() scheduler.run() # 运行调度程序 ``` 这段代码中启动了三个进程:tester 进程用于测试代理 IP 的可用性,getter 进程用于获取代理 IP,server 进程用于提供代理 IP 的 API 接口。其中,每个进程都有自己的运行函数,它们会循环运行并在一定时间间隔内执行一次相应的操作。如果不需要某个进程,则会直接退出。调度程序会等待所有进程运行结束,并在捕获到键盘中断信号时及时关闭进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值