做雷霆熔炉任务怎么做,做雷霆熔炉任务怎么做

一行代码完成并行任务 - 博客 - 伯乐在线
& 一行代码完成并行任务
| 分类: ,
众所周知,Python的并行处理能力很不理想。我认为如果不考虑线程和GIL的标准参数(它们大多是合法的),其原因不是因为技术不到位,而是我们的使用方法不恰当。大多数关于Python线程和多进程的教材虽然都很出色,但是内容繁琐冗长。它们的确在开篇铺陈了许多有用信息,但往往都不会涉及真正能提高日常工作的部分。
DDG上以“Python threading tutorial (Python线程教程)”为关键字的热门搜索结果表明:几乎每篇文章中给出的例子都是相同的类+队列。
事实上,它们就是以下这段使用producer/Consumer来处理线程/多进程的代码示例:
#Example.py
'''
Standard Producer/Consumer Threading Pattern
'''
import time
import threading
import Queue
class Consumer(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self._queue = queue
def run(self):
while True:
# queue.get() blocks the current thread until
# an item is retrieved.
msg = self._queue.get()
# Checks if the current message is
# the &Poison Pill&
if isinstance(msg, str) and msg == 'quit':
# if so, exists the loop
# &Processes& (or in our case, prints) the queue item
print &I'm a thread, and I received %s!!& % msg
# Always be friendly!
print 'Bye byes!'
def Producer():
# Queue is used to share items between
# the threads.
queue = Queue.Queue()
# Create an instance of the worker
worker = Consumer(queue)
# start calls the internal run() method to
# kick off the thread
worker.start()
# variable to keep track of when we started
start_time = time.time()
# While under 5 seconds..
while time.time() - start_time & 5:
# &Produce& a piece of work and stick it in
# the queue for the Consumer to process
queue.put('something at %s' % time.time())
# Sleep a bit just to avoid an absurd number of messages
time.sleep(1)
# This the &poison pill& method of killing a thread.
queue.put('quit')
# wait for the thread to close down
worker.join()
if __name__ == '__main__':
Producer()
唔…….感觉有点像Java。
我现在并不想说明使用Producer / Consume来解决线程/多进程的方法是错误的——因为它肯定正确,而且在很多情况下它是最佳方法。但我不认为这是平时写代码的最佳选择。
它的问题所在(个人观点)
首先,你需要创建一个样板式的铺垫类。然后,你再创建一个队列,通过其传递对象和监管队列的两端来完成任务。(如果你想实现数据的交换或存储,通常还涉及另一个队列的参与)。
Worker越多,问题越多。
接下来,你应该会创建一个worker类的pool来提高Python的速度。下面是IBM tutorial给出的较好的方法。这也是程序员们在利用多线程检索web页面时的常用方法。
#Example2.py
'''
A more realistic thread pool example
'''
import time
import threading
import Queue
import urllib2
class Consumer(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self._queue = queue
def run(self):
while True:
content = self._queue.get()
if isinstance(content, str) and content == 'quit':
response = urllib2.urlopen(content)
print 'Bye byes!'
def Producer():
'http://www.python.org', ''
'http://www.scala.org', ''
queue = Queue.Queue()
worker_threads = build_worker_pool(queue, 4)
start_time = time.time()
# Add the urls to process
for url in urls:
queue.put(url)
# Add the poison pillv
for worker in worker_threads:
queue.put('quit')
for worker in worker_threads:
worker.join()
print 'Done! Time taken: {}'.format(time.time() - start_time)
def build_worker_pool(queue, size):
workers = []
for _ in range(size):
worker = Consumer(queue)
worker.start()
workers.append(worker)
return workers
if __name__ == '__main__':
Producer()
它的确能运行,但是这些代码多么复杂阿!它包括了初始化方法、线程跟踪列表以及和我一样容易在死锁问题上出错的人的噩梦——大量的join语句。而这些还仅仅只是繁琐的开始!
我们目前为止都完成了什么?基本上什么都没有。上面的代码几乎一直都只是在进行传递。这是很基础的方法,很容易出错(该死,我刚才忘了在队列对象上还需要调用task_done()方法(但是我懒得修改了)),性价比很低。还好,我们还有更好的方法。
Map是一个很棒的小功能,同时它也是Python并行代码快速运行的关键。给不熟悉的人讲解一下吧,map是从函数语言Lisp来的。map函数能够按序映射出另一个函数。例如
urls = ['', '']
results = map(urllib2.urlopen, urls)
这里调用urlopen方法来把调用结果全部按序返回并存储到一个列表里。就像:
results = []
for url in urls:
results.append(urllib2.urlopen(url))
Map按序处理这些迭代。调用这个函数,它就会返回给我们一个按序存储着结果的简易列表。
为什么它这么厉害呢?因为只要有了合适的库,map能使并行运行得十分流畅!
有两个能够支持通过map函数来完成并行的库:一个是multiprocessing,另一个是鲜为人知但功能强大的子文件:multiprocessing.dummy。
题外话:这个是什么?你从来没听说过dummy多进程库?我也是最近才知道的。它在多进程的说明文档里面仅仅只被提到了一句。而且那一句就是大概让你知道有这么个东西的存在。我敢说,这样几近抛售的做法造成的后果是不堪设想的!
Dummy就是多进程模块的克隆文件。唯一不同的是,多进程模块使用的是进程,而dummy则使用线程(当然,它有所有Python常见的限制)。也就是说,数据由一个传递给另一个。这能够使得数据轻松的在这两个之间进行前进和回跃,特别是对于探索性程序来说十分有用,因为你不用确定框架调用到底是IO 还是CPU模式。
要做到通过map函数来完成并行,你应该先导入装有它们的模块:
from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool()
这简单的一句就能代替我们的build_worker_pool 函数在example2.py中的所有工作。换句话说,它创建了许多有效的worker,启动它们来为接下来的工作做准备,以及把它们存储在不同的位置,方便使用。
Pool对象需要一些参数,但最重要的是:进程。它决定pool中的worker数量。如果你不填的话,它就会默认为你电脑的内核数值。
如果你在CPU模式下使用多进程pool,通常内核数越大速度就越快(还有很多其它因素)。但是,当进行线程或者处理网络绑定之类的工作时,情况会比较复杂所以应该使用pool的准确大小。
pool = ThreadPool(4) # Sets the pool size to 4
如果你运行过多线程,多线程间的切换将会浪费许多时间,所以你最好耐心调试出最适合的任务数。
我们现在已经创建了pool对象,马上就能有简单的并行程序了,所以让我们重新写example2.py中的url opener吧!
import urllib2
from multiprocessing.dummy import Pool as ThreadPool
'http://www.python.org',
'http://www.python.org/about/',
'/pub/a/python//metaclasses.html',
'http://www.python.org/doc/',
'http://www.python.org/download/',
'http://www.python.org/getit/',
'http://www.python.org/community/',
'https://wiki.python.org/moin/',
'http://planet.python.org/',
'https://wiki.python.org/moin/LocalUserGroups',
'http://www.python.org/psf/',
'http://docs.python.org/devguide/',
'http://www.python.org/community/awards/'
# Make the Pool of workers
pool = ThreadPool(4)
# Open the urls in their own threads
# and return the results
results = pool.map(urllib2.urlopen, urls)
#close the pool and wait for the work to finish
pool.close()
pool.join()
看吧!这次的代码仅用了4行就完成了所有的工作。其中3句还是简单的固定写法。调用map就能完成我们前面例子中40行的内容!为了更形象地表明两种方法的差异,我还分别给它们运行的时间计时。
# results = []
# for url in urls:
result = urllib2.urlopen(url)
results.append(result)
# # ------- VERSUS ------- #
# # ------- 4 Pool ------- #
# pool = ThreadPool(4)
# results = pool.map(urllib2.urlopen, urls)
# # ------- 8 Pool ------- #
# pool = ThreadPool(8)
# results = pool.map(urllib2.urlopen, urls)
# # ------- 13 Pool ------- #
# pool = ThreadPool(13)
# results = pool.map(urllib2.urlopen, urls)
Single thread:
14.4 Seconds
3.1 Seconds
1.4 Seconds
1.3 Seconds
相当出色!并且也表明了为什么要细心调试pool的大小。在这里,只要大于9,就能使其运行速度加快。
生成成千上万的缩略图
我们在CPU模式下来完成吧!我工作中就经常需要处理大量的图像文件夹。其任务之一就是创建缩略图。这在并行任务中已经有很成熟的方法了。
基础的单线程创建
import PIL
from multiprocessing import Pool
from PIL import Image
SIZE = (75,75)
SAVE_DIRECTORY = 'thumbs'
def get_image_paths(folder):
return (os.path.join(folder, f)
for f in os.listdir(folder)
if 'jpeg' in f)
def create_thumbnail(filename):
im = Image.open(filename)
im.thumbnail(SIZE, Image.ANTIALIAS)
base, fname = os.path.split(filename)
save_path = os.path.join(base, SAVE_DIRECTORY, fname)
im.save(save_path)
if __name__ == '__main__':
folder = os.path.abspath(
'11_18__IQM_Big_Sur_Mon__e10dc3e840')
os.mkdir(os.path.join(folder, SAVE_DIRECTORY))
images = get_image_paths(folder)
for image in images:
create_thumbnail(Image)
对于一个例子来说,这是有点难,但本质上,这就是向程序传递一个文件夹,然后将其中的所有图片抓取出来,并最终在它们各自的目录下创建和储存缩略图。
我的电脑处理大约6000张图片用了27.9秒。
如果我们用并行调用map来代替for循环的话:
import PIL
from multiprocessing import Pool
from PIL import Image
SIZE = (75,75)
SAVE_DIRECTORY = 'thumbs'
def get_image_paths(folder):
return (os.path.join(folder, f)
for f in os.listdir(folder)
if 'jpeg' in f)
def create_thumbnail(filename):
im = Image.open(filename)
im.thumbnail(SIZE, Image.ANTIALIAS)
base, fname = os.path.split(filename)
save_path = os.path.join(base, SAVE_DIRECTORY, fname)
im.save(save_path)
if __name__ == '__main__':
folder = os.path.abspath(
'11_18__IQM_Big_Sur_Mon__e10dc3e840')
os.mkdir(os.path.join(folder, SAVE_DIRECTORY))
images = get_image_paths(folder)
pool = Pool()
pool.map(create_thumbnail,images)
pool.close()
pool.join()
对于只改变了几行代码而言,这是大大地提升了运行速度。这个方法还能更快,只要你将cpu 和 io的任务分别用它们的进程和线程来运行——但也常造成死锁。总之,综合考虑到 map这个实用的功能,以及人为线程管理的缺失,我觉得这是一个美观,可靠还容易debug的方法。
好了,文章结束了。一行完成并行任务。
关于作者:
(新浪微博:)
微信关注: iProgrammer
最热门的技术类微信公共账号之一,全文推送精选技术文章。扫描加关注,碎片时间学习新技能!
Worktile – 团队协作利器
Python频道作者
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线博客团队正试图以我们微薄的力量,把优秀的原创/译文分享给读者,为“快餐”添加一些“营养”元素。
伯乐在线-博客(
)专注于分享职业相关的博客文章、业界资讯和职业相关的优秀工具和资源。博文类别包括:程序员、设计、营销、互联网、IT技术、自由职业、创业、运营、管理、翻译和人力资源等等。期待您通过和关注我们。如果您也愿意分享一份自己的原创/译文,可以~
网站合作和广告投放
联系邮箱:Webmaster (at)
(加好友请注明来意)
交换友情链接要求:PR>=4
网站使用问题
请直接询问或者反馈
欢迎关注并订阅伯乐在线博客您现在的位置:
& &&必做支线任务分享 FF14新手指南
必做支线任务分享 最终幻想14新手指南天极网游戏频道 15:36
  昨天到今天发现了一些比较关键问题,由于很多新手没有做足功课就来了,虽然我也是新手,但是我是做足功课的,就给新手们说说误区什么的,纯新手向啊。
  由于现在在上班时间,所以没有办法上图,我在的是一个正规单,在这上面比较严厉,我会后面上图的。
  据小伙伴的强烈要求,对加点进行说明,详细的说明在后面。
  一、主城
  首先大家都说主城的地图比较坑,刚开始确实不适应,但是一个无意间发现,如果你把主城里的所有跑腿任务都做了,那么你的城里的水晶和城里的地图都熟悉了,所以对于新手来说,一定要跑主城里的跑腿任务,也是一开始升级的要素。
  二、水晶和传送
  水晶,特别是传送这个东西,刚开始确实认为蛮快的,倒是不知不觉中发现钱没了,所以你就蛋疼吧。
  三、陆行鸟
  不知道大家有没有发现陆行鸟这个东西,作为FF的特色,你要说你不知道,我还真的说无言以对,陆行鸟这东西有2种,一个是像WOW一样的交通站,而且是必须要去开的点,特色是价格低,中途不会被怪攻击,在途中可以中途跳车,比如新手主城的沙城(黄金城)中部和西部都有陆行鸟。
  但是如果你要从中部到西部除了跑路没有选的,因为这个2个点不互通,要么你就从中部到沙城,在从沙城到西部,不过这类陆行鸟支持中途跳车。
  还是上面的例子,你要从西部到中部,先15块包个车跑到桥那跳车在跑过去,有人会说你累不累啊,确实有点累。
  下面就有了另一种陆行鸟
  这个好像只有主城才有这个服务,镇上的陆行鸟点并没有这个服务,这个东西也就是让你提前的感受坐骑,缺点,被怪物攻击和租赁时间到就消失了,如果你还没有坐骑但又是跑腿任务,你还是安心租一个吧,记得要顺着大路走,免得被怪攻击,鸟消失了。
  其实一开始蛮推荐大家做固定的,中途跳车,混到20开坐骑任务。
  四、任务系统
  任务谁上去看着都会头大,但是做过功课的人就知道了,主线是一定要做的走的,支线并不是一定要做的,但是某些支线任务 由有关一些服务,比如陆行鸟、理发这类,大家都知道一共有3大主城,3个主城的任务都不一样
  但是么个主城对于了不同的职业,还是用沙城举个例子,你可以做主线和支线让你快速升级,那么如果你要练沙城的其他2个职业的话,特别是那些全职业制霸的人,你就会发现自己在一个任务真空区,比如你已经把剑斗练到30了,你把所有到30的主线和支线都清了,你不习惯剑斗和,那么想回去玩拳师,那么你1~30级就处于一个任务真空区,没有任何的地图任务给你做,因为你做完了。
  你除了你的H讨伐任务和FATE任务以外,你基本没有选择,所以你被你自己坑了,特别是到后面30级以后,大家都汇集到了一个集中地图,要是继续这样主线+支线,坑不死你。
  一般的话,做主线讨伐开了以后,路上遇到讨伐怪你就打,讨伐任务给的经验还是满高的,遇到等级相近的FATE(也就是突发任务,)去做,只要你从头打到尾,一次半管经验妥妥的,如果你是攻击高的职业 你的连击较高那么一次一级也是有可能的,基本上主线+讨伐+FATE,不会相差太多,支线任务就最好留给副职业。
  就有人会说了理符任务,虽然理符任务也是升级的一个手段,理符任务每天刷新6次,可以积攒,最高积攒次数为100,不过这个东西推荐给生产职业,就算你做100个理符,你的战斗职业也不会升级太多。
  以下这些任务是一定要做的。
  一个是用来开启攻略手册的任务,15级支线任务”被遗忘的手册”,在海都沉溺海豚亭接。完成攻略手册里的要求,可以获得不同的奖励,从经验到金币到军票等,而且每周会重置一次攻略手册的奖励。这个任务很重要,一定要记得完成。
  一个是用来开启陆行鸟搭档模式的,30级支线任务”值得信赖的伙伴”,在黑衣森南部森林(x17,y28)接,完成后可以使用野外召唤出陆行鸟跟你一起战斗,召唤一次持续30分钟,此时不可使用自动排本功能。随着打怪获取经验还可以升级,升级后的陆行鸟可以选择往T、Healer、DPS三个方向加点,来增强其战斗力。右键点击召唤出的陆行鸟,可以解除召唤。召唤陆行鸟后,无法乘坐陆行鸟以外的坐骑。
  一个是用来开启装备染色功能的,15级支线任务”色彩斑斓的世界”,在西萨纳兰(x12,y24)接,三国主城杂货店购买橙汁后,交给任务NPC即可。
  一个是用来开启将满精炼度的装备魔晶石化功能的,19级支线任务”情感培育之力”,在中央萨纳兰(x23,y18)接,完成后会得到一个可以将满精炼度的装备魔晶石化的技能。自己所穿戴的装备,会随着打怪获取经验而提高精炼度,生产职业则是随着生产物品获取经验而提高。当装备精炼度提高到100%时系统会提示你,此时可将装备转化成魔晶石,同时装备消失,根据装备的种类,所能转化成的魔晶石类型也固定,比如生产职业的装备会固定转化为生产向属性的魔晶石。
  一个是用来开启魔晶石镶嵌功能的,19级支线任务”情感传递之力”,也在中央萨纳兰(x23,y18)接,是上面那个任务的后续任务,但是要求玩家某个生产职业(除了厨师外)达到19级以上。完成后可得到一个镶嵌魔晶石的技能,但是镶嵌特定装备必须找对应的生产职业(如,要给布袍镶嵌,必须找完成了此任务的裁衣匠),而且角色的职业等级必须高于装备品级。找别人镶嵌并不需要将魔晶石和装备交给对方,但对方需要消耗对应的媒介,应当将这部分费用付给对方。另外根据装备的品质、品级、等级不同,通过镶嵌魔晶石,能够提高的属性上限不同,并不是只要有孔,镶嵌上就一定能得到那些属性。此后的”镶嵌魔晶石II”也是在这里接。
  一个是用来开启寻宝模式的,36级支线任务”财宝的浪漫!寻宝猎人!”,在东拉诺西亚(x21,y21)接,完成后可以得到解读藏宝图和挖宝两个技能。藏宝图是RARE的,身上只能携带一张,不过可以先解读一张再随身携带一张。解读后需要玩家根据藏宝图上的地图片段来找到宝藏的位置,找到正确位置挖宝后会显示出宝箱,点击宝箱会随机刷一些怪,G5藏宝图推荐4人以上组队,因为刷的怪实力和数量都比较高。藏宝图本身可通过采集、钓鱼等概率获得,免得被坑。
  五、打怪距离打击感和GCD
  很多人说没打击感,打怪距离什么的,我只能说这不是韩国游戏,如果对日式的游戏有着比较深入的了解,那么都不算太吐槽这里,打怪距离什么的要自己去摸索,在什么范围内能使用技能打到怪,免得一个技能就直接刻意MISS的节奏太浪费了,特别是后期的拳师和龙骑,这2个职业的某些特定技能和BUFF要打击相应的部位来触发,如背部和侧面,这些都是要多多练习的。
  这是MMORPG不是动作网游,GCD是特色希望大家要好好的利用,很多技能都是GCD,颠覆了我们对MMORPG的技能设定,以前只要是脸GUN,现在多了一分理性,让你更合理的运用GCD的时间,做出思考。
  也同时杜绝了一键宏的可能,脸GUN键盘小心脸GUN画了是小事,键盘坏了是大事。
  你的脸我不关心,坏了就坏了吧,反正少了情敌(腹黑的我再一次出现)
  举个例子。
  在15级就3个输出技能,都是以先锋为原则,那么先锋起手GCD,在GCD期间战逃反应,普通攻击后GCD消失,这样你在站逃BUFF期间能保证有足够的输出量,要是你血下一半了,GCD期间用铁壁,其实GCD也就上各种BUFF的最好时机,要去适应并且发现其中的奥妙。
(作者:网络责任编辑:薛嘉炯)
欢迎在新浪微博上关注我们
* 网友发言均非本站立场,本站不在评论栏推荐任何网店、经销商,谨防上当受骗!
数码整机手机软件出色地完成工作任务
出色地完成工作任务的英文翻译
出色地完成工作任务的用法和样例:
white board
textile board
出色地完成工作任务的海词问答与网友补充:
出色地完成工作任务的相关资料:
相关词典网站:20级要去哪里做任务啊
作者:tgbus整理 来源:网络 发布时间:12-27
内容摘要:20级要去哪里做任务啊 我问现在19 在弓箭手的出生地徘徊 怎幺出了主线任务和职业任务 都没别的支线任务了 难道要漂洋过海 去别的城市做任务吗。 跟着主线走肯定要漂洋过海啊。。...
  20级要去哪里做任务啊
  我问现在19 在弓箭手的出生地徘徊 怎幺出了主线任务和职业任务 都没别的支线任务了 难道要漂洋过海 去别的城市做任务吗。
  跟着主线走肯定要漂洋过海啊。。。另外每个城往野外扩展都会有15-20左右的营地,会有相应的卡片任务和支线任务。

我要回帖

更多关于 神武旗包任务怎么做 的文章

 

随机推荐