多进程

老出BUG怎么办?游戏服务器常见问题解决方法分享

♀尐吖头ヾ 提交于 2019-12-06 08:04:39
在游戏开发中,我们经常会遇到一些技术难题,而其引发的bug则会影响整个游戏的品质。女性向手游《食物语》就曾遇到过一些开发上的难题,腾讯游戏学院专家团Wade、Zc、Jovi等专家为其提供了指导和帮助。过载保护、集群、服务器通信、并发选型等方面的问题,是中小团队常常的技术难题,本文分享了一些专家在坐诊过程中遇到的游戏服务器常见问题解决方法,希望对大家有所帮助。 问题一:玩家登录时拉取好友信息,但好友服务繁忙导致登录失败。 解决方法: 1、分离关键路径上非关键调用,缩短事务流程,避免周边服务异常阻塞登录。 2、服务熔断机制,超出处理能力快速失败,防止雪崩。 3、按用户隔离事务,避兔单个用户请求阻塞影响到其他用户。 问题二:压测并发登录对redis产生很大压力。 解决方法:redis数据表数量多,一次事务会产生多个 redis请求,小表合并为大表。 Wade:服务器进程的管理一般比较简单,有很多还是用配置文件静态组织的。同时往往进程间通信的手段比较缺乏,没有使用消息队列中间件,甚至还有用 Redis 来做通信组件使用的。为了提高集群管理的自动化水平,使用 ZooKeeper 是一个比较常见的方法。 Zc:redis一般做为内存缓存来使用,不宜将关键数据存放在redis中.其数据安全性并不如一般的DB。在使用过程中也需要参考性能基线,控制访问频率和流量。 问题三:外部服务有延迟

python_多进程

為{幸葍}努か 提交于 2019-12-06 05:36:46
一、多进程 1、多线程,多进程 多线程: 适用于io密集型任务 多进程 适用于cpu密集型任务 1 import multiprocessing,time,virtualenv 2 def down_load(): 3 time.sleep(5) 4 print('运行完了') 5 6 if __name__ == '__main__': 7 for i in range(5): 8 p = multiprocessing.Process(target=down_load) 9 p.start() 10 while len(multiprocessing.active_children()) !=0: #等待子进程结束 11 pass 12 13 print(multiprocessing.current_process()) 14 print('end') 来源: https://www.cnblogs.com/xumb/p/11964268.html

05-01 爬虫高性能相关

寵の児 提交于 2019-12-06 01:12:22
05-01 爬虫高性能相关 一 背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个结束后才能继续下一个,效率会非常低。 需要强调的是:对于单线程下串行N个任务,并不完全等同于低效,如果这N个任务都是纯计算的任务,那么该线程对cpu的利用率仍然会很高,之所以单线程下串行多个爬虫任务低效,是因为爬虫任务是明显的IO密集型程序。 关于IO模型详见 链接:http://www.cnblogs.com/linhaifeng/articles/7454717.html 那么该如何提高爬取性能呢?且看下述概念 二 同步、异步、回调机制 1、同步调用:即提交一个任务后就在原地等待任务结束,等到拿到任务的结果后再继续下一行代码,效率低下 同步调用 2、一个简单的解决方案:多线程或多进程 #在服务器端使用多线程(或多进程)。多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接。 多进程或多线程 该方案的问题是: #开启多进程或都线程的方式,我们是无法无限制地开启多进程或多线程的:在遇到要同时响应成百上千路的连接请求,则无论多线程还是多进程都会严重占据系统资源,降低系统对外界响应效率,而且线程与进程本身也更容易进入假死状态。 3、改进方案: 线程池或进程池

一篇文章搞定Python多进程(全)

巧了我就是萌 提交于 2019-12-06 00:52:40
1.Python多进程模块 Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Process对象来创建一个进程对象。这个进程对象的方法和线程对象的方法差不多也有start(), run(), join()等方法,其中有一个方法不同Thread线程对象中的守护线程方法是setDeamon,而Process进程对象的守护进程是通过设置daemon属性来完成的。 下面说说Python多进程的实现方法,和多线程类似 2.Python多进程实现方法一 from multiprocessing import Process def fun1(name): print('测试%s多进程' %name) if __name__ == '__main__': process_list = [] for i in range(5): #开启5个子进程执行fun1函数 p = Process(target=fun1,args=('Python',)) #实例化进程对象 p.start() process_list.append(p) for i in process_list: p.join() print('结束测试') 结果 测试Python多进程 测试Python多进程

python 多进程

核能气质少年 提交于 2019-12-05 23:58:49
#方法一 直接调用 import time import random from multiprocessing import Process def run(name): index = 0 for i in range(3): print('%s runing' %name) time.sleep(random.randrange(1,5)) print('%s running end' %name) index +1 l = [] if __name__ == "__main__": for i in range(20): p = Process(target=run,args=(i,)) p.start() l.append(p) for proc in l: proc.join() print("执行完毕") 来源: https://www.cnblogs.com/asia9847/p/11951783.html

Python多进程实现多核并发

ぃ、小莉子 提交于 2019-12-05 20:40:06
1.多线程和多进程 Python多线程由于有全局锁的缘故,在执行的时候,同一时间只能执行一个线程,并不能实现多核并发,对于CPU密集型的任务来说,效率和单线程没区别。如果需要多核并发的话,可以采用多进程的方式实现。 2.代码 下面举一个简单的例子说明: from multiprocessing import Pool import time # 要执行的任务 def task(name): print('process %s is running' % name) time.sleep(1) # 模拟任务执行的时间 print('process %s done' % name) if __name__ == '__main__': start_time = time.time() pool = Pool(processes=4) # 创建进程池,指定最大并发进程数 for i in range(4): pool.apply_async(task, (i,)) # 每个进程调用task函数, 用元组的形式传递参数 pool.close() # 关闭进程池 pool.join() # 主进程等待进程池中的进程执行完毕 end_time = time.time() duration = end_time - start_time print('main process duration:

15 python学习笔记-多进程multiprocessing

半世苍凉 提交于 2019-12-05 18:14:58
上篇介绍了Python的多线程,python的多线程是不能利用多核CPU的,如果想利用多核CPU的话,就得使用多进程。python中多进程使用multiprocessing模块。 1、python多进程实例如下: 1 import multiprocessing,time 2 def down_load(): 3 time.sleep(1) 4 print("运行完了") 5 6 if __name__ == '__main__': 7 start_time=time.time() 8 for i in range(5): 9 p = multiprocessing.Process(target=down_load) #创建一个进程 10 p.start() #启动进程 11 while len(multiprocessing.active_children())!=0:#等待子进程结束,效果同于join 12 pass 13 end_time=time.time() 14 print(multiprocessing.current_process()) #输出当前运行的线程 15 print(end_time-start_time) 16 print('end')=======================================执行结果================

初识多线程

断了今生、忘了曾经 提交于 2019-12-05 13:46:19
进程 进程就是正在运行的程序,是系统进行资源分配和调用的独立单位。 每一个进程都有它自己的内存空间和系统资源。 多进程的意义 单进程计算机只能做一件事情。而我们现在的计算机都可以一边玩游戏(游戏进程),一边听音乐(音乐进程), 所以我们常见的操作系统都是多进程操作系统。比如:Windows,Mac和Linux等,能在同一个时间段内执行多个任务。 对于单核计算机来讲,游戏进程和音乐进程是同时运行的吗?不是。 因为CPU在某个时间点上只能做一件事情,计算机是在游戏进程和音乐进程间做着频繁切换,且切换速度很快, 所以,我们感觉游戏和音乐在同时进行,其实并不是同时执行的。多进程的作用不是提高执行速度,而是提高CPU的使用率。 线程 在一个进程内部又可以执行多个任务,而这每一个任务我们就可以看成是一个线程。是程序使用CPU的基本单位。所以,进程是拥有资源的基本单位, 线程是CPU调度的基本单位。 多线程的意义 多线程的作用不是提高执行速度,而是为了提高应用程序的使用率。那么怎么理解这个问题呢? 我们程序在运行的使用,都是在抢CPU的时间片(执行权),如果是多线程的程序,那么在抢到CPU的执行权的概率应该比较单线程程序抢到的概率要大.那么也就是说,CPU在多线程程序中执行的时间要比单线程多,所以就提高了程序的使用率.但是即使是多线程程序,那么他们中的哪个线程能抢占到CPU的资源呢

Python: 多进程multiprocessing.managers

大城市里の小女人 提交于 2019-12-05 07:37:24
multiprocessing.managers Server process Manager()返回一个manager对象。它控制一个服务器进程,这个进程会管理Python对象并允许其他进程通过代理的方式来操作这些对象。 manager对象支持多种类型。例子见下: from multiprocessing import Process, Manager def f(d, l): d[1] = "1" d["2"] = 2 d[0.25] = None l.reverse() if __name__ == '__main__': with Manager() as manager: d = manager.dict()     #产生一个代理对象d l = manager.list(range(10)) p = Process(target=f, args=(d,l)) p.start() p.join() print(d) print(l) 解释: with语句: 见这篇文章 with 语句是从 Python 2.5 开始引入的一种与 异常处理相关 的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with

多进程和协程区别

房东的猫 提交于 2019-12-05 05:05:41
多进程 是在多个进程中,一个进程的阻塞并不会影响到其他进程。比如在一个进程中进行大量的计算操作,并不会对其他进程产生较大影响。 协程 就是在一个线程中,如果协程中一个任务发生阻塞,其余任务也将受到影响。比如说在一个任务中,进行大量的计算操作,那么这个任务将会阻塞其余的任务。 所以协程不适合处理计算密集型的任务,而适合处理IO密集型的任务,因为携程配合异步IO,就可以在不阻塞进程情况下,又能获得同步编程的快感。 来源: https://www.cnblogs.com/bigtreei/p/11908473.html