python文件加锁
㈠ python queue 用加锁吗
队列是否加锁不取决于语言,取决于是否为多线程访问
㈡ 使用python写文件时,如何做到写入文件由于外力删掉了之后可以新创建一个同名文件并继续写入
你的试验很详细。不过这个现象在linux下可能与windows下不一样。 通常改名或者是删除后文件就失效了。写入操作也是无效的。
为了防止别人修改你的文件,通常在写入时,会加上一个锁。使用操作系统特有的open方法才可以加锁。
可以使用portalocker,filelock 也可以使用posixfile,
os.open能不能成呢?按理可以。不过C语言里使用fopen没有这个功能,不过使用fcntl里的open可以。
你加了锁后,别人就不能写。文件处于占用状态。
另外操作系统都有一种文件监控机制的消息通知。具体忘记了。在unix与windows都有这个功能。当别人程序修改了某个文件,你会立刻得到消息通知。
补充一些教程。os.open还是可以用的。
os.open(file, flags[, mode]);
Parameters
file -- File name to be opened.
flags -- This is the following constants are options for the flags. They can be combined using the bitwise OR operator |. Some of them are not available on all platforms.
os.O_RDONLY: open for reading only
os.O_WRONLY: open for writing only
os.O_RDWR : open for reading and writing
os.O_NONBLOCK: do not block on open
os.O_APPEND: append on each write
os.O_CREAT: create file if it does not exist
os.O_TRUNC: truncate size to 0
os.O_EXCL: error if create and file exists
os.O_SHLOCK: atomically obtain a shared lock
os.O_EXLOCK: atomically obtain an exclusive lock
os.O_DIRECT: eliminate or rece cache effects
os.O_FSYNC : synchronous writes
os.O_NOFOLLOW: do not follow symlinks
mode -- This work in similar way as it works for chmod() method.
㈢ Python能不能写病毒
国家计算机病毒应急处理中心通过对互联网的监测发现,一种利用python语言编写的恶意木马程序出现。该恶意程序通过伪装成多款常用应用软件等进行传播,诱使计算机用户下载安装。
这个新型的勒索病毒叫Dablio,理论上可以感染下列文件类型,也就是你电脑中以下列名字作为后缀名的文件,全部打不开。
相关推荐:《Python入门教程》
看了上面的文件类型,我也服了。这做毒的比我还想的周到。合着有点用的文件全想感染。
我们分析发现,该恶意软件就是一款勒斗颂轿索软件,其具有以下功能:
一、木马会判断自身进程名是否为systern.exe。如果不是,则将自身复制为C:UsersPublicsystern.exe 并执行;
二、释放s.bat批处理脚本,关闭各种数据库和web服务及进程;
三、遍历受感染操作系统的所有盘符中的指定文件进行加密,加密后修改文件的扩展名为MyChemicalRomance4EVER;
四、木马会调用系统的wevtutil命令空肆,对系统日志中的“系统”、“安全”和“应用程序”三部分日志内容进行清理,并删除自身;
五、使用AES对称算法进行加密;
另外,恶意木马程序完成加密后,会在操作系统中生成一个存有勒索信息的文本文件,提示并要求受感染的用户访问指定的Web网站支付一定的比特币(电子货币),系统中加密的文件才可以被解锁。
专家提醒:
针樱世对这种情况,国家计算机病毒应急处理中心建议广大计算机用户采取如下防范措施:
(一)不要从陌生的网站下载应用程序。
(二)建议打开操作系统中防病毒软件的“实时监控”功能,对操作操作进行主动防御,这样可以第一时间监控未知病毒的入侵活动。
㈣ 多线程文件写同一个文件写不进去
这可能是由于多线程同时访问同一个文件导致的写入冲突问题。为了避免这个问题,您可以滚滚使用一些常见的解决方案:
1. 使用文件锁定:在每次写文件时请求文件锁定,确保同一时间只有一个线程可以写入数据。
2. 对写操作进行序列化:通过将写操作集中到一个线程中,避免多个线程同时写入同一个文件,从而避免冲突。
3. 确保写操作的原子性:使用特殊的写操作来确保所有的写入都是不可分割的,以避免出现冲突。
4. 使用专门的文件写入工具:使用专门的文件写入工具,例如 log4cxx,它可以处理多线程写入同一个文件的情况,并且能够保证性能和正确性。
总之,为了避免多线程写同一个文件导致的冲突问题,您需要选择适当的解决方案,根据具体情况大世余进行调整和返茄优化。
㈤ python多个线程锁可提高效率吗
首先,Python的多线程本身就是效率极低的,因为有GIL(Global Interpreter Lock:全局解释锁)机制的限制,其作用简单说就是:对于一个解释器,只能有一个线程在执行bytecode。
所以如果为了追求传统意义上多线程的效率,在Python界还是用多进程(multiprocessing)吧……
这里你用了多线程,且用了锁来控制公共资源,首先锁这个东西会导致死锁,不加锁反而没有死锁隐患,但会有同步问题。
另外,如果不同线程操作的是不同的文件,是不存在同步问题的,如果操作同一个文件,我建议采用Queue(队列)来处理。
总的来说,用单线程就好了,因为Python多线程本身就没什么效率,而且单线程也不用考虑同步问题了。非要追求效率的话,就用多进程吧,同样也要考虑进程锁。
㈥ Python中的锁都具有哪些
大致罗列一下:
一、全局解释器锁(GIL)
1、什么是全局解释器锁
每个CPU在同一时间只能执行一个线程,那么其他的线程就必须等待该线程的全局解释器,使用权消失后才能使用全局解释器,即使多个线程直接不会相互影响在同一个进程下也只有一个线程使用cpu,这样的机制称为全局解释器锁(GIL)。GIL的设计简化了CPython的实现,使的对象模型包括关键的内建类型,如:字典等,都是隐含的,可以并发访问的,锁住全局解释器使得比较容易的实现对多线程的支持,但也损失了多处理器主机的并行计算能力。
2、全局解释器锁的好处
1)、避免了大量的加锁解锁的好处
2)、使数据更加安全,解决多线程间的数据完整性和状态同步
3、全局解释器的缺点
多核处理器退化成单核处理器,只能并发不能并行。
4、GIL的作用:
多线程情况下必须存在资源的竞争,GIL是为了保证在解释器级别的线程唯一使用共享资源(cpu)。
二、同步锁
1、什么是同步锁?
同一时刻的一个进程下的一个线程只能使用一个cpu,要确保这个线程下的程序在一段时间内被cpu执,那么就要用到同步锁。
2、为什么用同步锁?
因为有可能当一个线程在使用cpu时,该线程下的程序可能会遇到io操作,那么cpu就会切到别的线程上去,这样就有可能会影响到该程序结果的完整性。
3、怎么使用同步锁?
只需要在对公共数据的操作前后加上上锁和释放锁的操作即可。
4、同步锁的所用:
为了保证解释器级别下的自己编写的程序唯一使用共享资源产生了同步锁。
三、死锁
1、什么是死锁?
指两个或两个以上的线程或进程在执行程序的过程中,因争夺资源或者程序推进顺序不当而相互等待的一个现象。
2、死锁产生的必要条件?
互斥条件、请求和保持条件、不剥夺条件、环路等待条件
3、处理死锁的基本方法?
预防死锁、避免死锁(银行家算法)、检测死锁(资源分配)、解除死锁:剥夺资源、撤销进程
四、递归锁
在Python中为了支持同一个线程中多次请求同一资源,Python提供了可重入锁。这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。递归锁分为可递归锁与非递归锁。
五、乐观锁
假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
六、悲观锁
假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
python常用的加锁方式:互斥锁、可重入锁、迭代死锁、互相调用死锁、自旋锁大致罗列一下:
一、全局解释器锁(GIL)
1、什么是全局解释器锁
每个CPU在同一时间只能执行一个线程,那么其他的线程就必须等待该线程的全局解释器,使用权消失后才能使用全局解释器,即使多个线程直接不会相互影响在同一个进程下也只有一个线程使用cpu,这样的机制称为全局解释器锁(GIL)。GIL的设计简化了CPython的实现,使的对象模型包括关键的内建类型,如:字典等,都是隐含的,可以并发访问的,锁住全局解释器使得比较容易的实现对多线程的支持,但也损失了多处理器主机的并行计算能力。
2、全局解释器锁的好处
1)、避免了大量的加锁解锁的好处
2)、使数据更加安全,解决多线程间的数据完整性和状态同步
3、全局解释器的缺点
多核处理器退化成单核处理器,只能并发不能并行。
4、GIL的作用:
多线程情况下必须存在资源的竞争,GIL是为了保证在解释器级别的线程唯一使用共享资源(cpu)。
二、同步锁
1、什么是同步锁?
同一时刻的一个进程下的一个线程只能使用一个cpu,要确保这个线程下的程序在一段时间内被cpu执,那么就要用到同步锁。
2、为什么用同步锁?
因为有可能当一个线程在使用cpu时,该线程下的程序可能会遇到io操作,那么cpu就会切到别的线程上去,这样就有可能会影响到该程序结果的完整性。
3、怎么使用同步锁?
只需要在对公共数据的操作前后加上上锁和释放锁的操作即可。
4、同步锁的所用:
为了保证解释器级别下的自己编写的程序唯一使用共享资源产生了同步锁。
三、死锁
1、什么是死锁?
指两个或两个以上的线程或进程在执行程序的过程中,因争夺资源或者程序推进顺序不当而相互等待的一个现象。
2、死锁产生的必要条件?
互斥条件、请求和保持条件、不剥夺条件、环路等待条件
3、处理死锁的基本方法?
预防死锁、避免死锁(银行家算法)、检测死锁(资源分配)、解除死锁:剥夺资源、撤销进程
四、递归锁
在Python中为了支持同一个线程中多次请求同一资源,Python提供了可重入锁。这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。递归锁分为可递归锁与非递归锁。
五、乐观锁
假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
六、悲观锁
假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
python常用的加锁方式:互斥锁、可重入锁、迭代死锁、互相调用死锁、自旋锁
㈦ 如何用多线程读取大文件并且做数据处理,100
先说几个要点:
a、文件在操作系统级,有描述符标记,关联到打开的文件表项,文件表项纪录了一个很重要的信息,当前文件的指针;
b、cpu要干的工作比读文件快不,读一次文件的速度要慢于cpu处理一次的速度,没必要多多线程,多线程提升不了多少性能,还增加编程的难度,单线程处理即可。
c、待处理文件,必须知道一定的边界值,如分页边界或单条纪录边界。
有了上面的前提,每个线程维护单独的缓冲区,缓存区大小就是c点提到的边界纪录大小。线程启动,把缓冲区读满,处理数据。此处有个要点,必须做文件锁,把要读的边界锁住。否则读出来的数据会产生混乱。(如果强行打开多个不同的文件不划算,内存占用可能会过多)。产生混乱的原因简单,读文件实际上是进行系统调用,系统调用有自己的缓冲区,这缓冲区未必跟你设置的缓冲区一样大。多次读多次移动指针,不加文件锁处理的数据必定会乱。
文件锁两种方式加锁,对整个文件加锁,对字节区间加锁。都不是什么难事。
实现方式1:对整个文件加锁,因为我们要保证的是读到的数据别混乱。
实现方式2:如果内存足够大,维护n个独立的文件描述符,这些文件描述符必须有独立的文件指针,操作系统上有对应实现。每个线程操作未读纪录,这么做还需要维护共享的已读纪录指针。防止重复处理。这么做处理完成如果需要按顺序合并文件是难点。处理过的数据有新的纪录边界。要视实际情况而定能不能这么做。写程序要优先保证的是正确性,之后才是提升效率。
我说的理论,依据是操作系统提供的api处理。别的语言要依赖操作系统运行。原理差不多,目标语言有没有操作系统提供的api强悍。依据使用的目标语言而定。绝大多数能叫编程语言的语言都会提供操作系统api对应的方法。(脚本语言例外,如shell,perl,javascript,vbscript,就可能没这么强的控制能力。),java,objective-c,swift,php,python一般是不会有问题的。
㈧ 魔兽私服
主要的你要有2件东西
第一:魔兽世界客户端
第二:数据库
这里废话就不说了,本人架设过WOWSF,说说数圆基据库这块,一般不会编程的人都觉得很神秘。一般都采用ODBC和MYsql,ODBC是电脑自带的,MYSQL因为比较小功能全,很方便使用推荐这两个。网上看有人写的比较全大部分引用的懒得重新再写了,我看还比较详细,关键处做了注释没修改。比较难懂的就是SQL语句那里,照做就OK。mysql用得是可视化界面很好操作你要没用过就下中文版,有中文的。
mysql4.0.2
mysql-control-center0.9.4
MyODBC-standard-3.51
(上面3个都是架设服务器用的数据库端和数据库管理端:mysql4.0.2是数据库主程序,mysql-control center0.9.4是数据库管理界面程序,MyODBC是MySQL与Windows数据服务的连接驱动)
当然还有wow beta3客户端和3734(就是0.8.0)补丁
需要的数据库有:
25M的python.sql
7M的python.sql
几个1k左右的commands.sql,creatures_mov.sql,gmlogin.sql,npc_text.sql,sh.sql,trainers.sql
(注意以上的数据库要下载的然后导入mysql)
1. 先安装mysql,mysqlcc,ODBC然后重起。
重起后看看右下的系统托盘里有没有个橘盯谨红绿灯的图标,没有的话运行c:\mysql\bin\winmysqladmin.exe
开始架服务器:
运行 mysqlcc ,新建服务器:
name:python
host:localhost
user:root
password:空
2. 确定后双击“ python ”,右键点击 DataBases ,新建数据库取名 wow 。
右击User Administration,新建用户。名字随便,Hose:localhost,密码自己记好。
选上All Privileges,右边在Global Privileges和wow上打对勾,应用。
再把系统自动添加的@localhost用户的All P....和Glo...,wow上也打上对勾应用。
3. 不关程序,到控制面板,管理工具,服务:mysql。
停止服务,在参数空白行里输入
safe_MySQLd -O key_buffer=16M -O table_cache=128 -O sort_buffer=4M -O record_buffer=1M -O max_allowed_packet=30M
启用则银服务。
4. 回到mysqlcc,右键点击/Databases/wow,开启新窗口。
点击新开窗口上面的SQL按钮,再选择菜单里的文件\打开...
打开25M的python.sql(加载需要好长时间)然后点击按钮栏里的“!”按钮。
看执行成果,没有X的就是成功了,有错误的话删掉wow数据库,从“3.”处重新开始。
5. 打开控制面板\管理工具\ODBC数据源(不同的操作系统名字可能不同)
选择:系统DNS,添加,MySQL ODBC3.51 Driver。
Date Source Name:(2.里建立的用户名)
Host/Server Name(or IP):localhost
DataBase Name:wow
User:(2.里建立的用户名)
Password:(2.里建立的密码)
6. 启用python服务器,但停止wow库。把7M的python.sql和N个1K的.sql文件拷贝到c:\mysql\bin\
运行c:\mysql\bin\mysql.exe
在命令行里输入\. python.sql
\. commands.sql
依此类推...
7. 加载完毕后启动wow库,运行wowpython0.89,输入:
host 127.0.0.1(或者你的外网IP或者局域网IP)
lanhost *.*.*.*(你的局域网IP)
db localhost (你刚才“2.”建立的用户名) (你输入的密码) wow
start
出现服务器开始运行的提示后就可以运行游戏了。
注意事项:只是想单机玩的host地址随便,lanhost用开始菜单/运行/cmd/ipconfig看到内网地址。
想局域网玩的host,lanhost都用内网IP。想架外网服务器的就要知道自己的外网实际IP了。
8. 自己玩或者局域网内玩游戏,进游戏登陆界面后按“~”打开控制台,输入“realmlist (你在“7.”所输入的内网IP)”使用wow表account项里面的GM账号登陆游戏。
OK!架设完毕!
scripts/items.scp(物品资料与代码)scripts/creatures.scp(npc资料与代码)saves/players.save(玩家资料)scripts/areatrigge
scripts/items.scp(物品资料与代码)
scripts/creatures.scp(npc资料与代码)
saves/players.save(玩家资料)
scripts/areatriggers.scp(传诵换场景的资料)
scripts/emu.conf(模拟器连接资料,在这里修改IP,要让别的电脑也进来玩就改成你的IP)
saves/world.save(刷NPC的资料)
scripts/quests.scp(任务的资料)
scripts/classes.scp(应该是属于初始的天赋)
scripts/spellcost.scp(技能代码)
scripts/pages.scp(npc说话定义)
scripts/gameobjects.scp(游戏中物体名称,模型号定义)
scripts/creatures.scp(npc定义)
scripts/defines.scp(应该是所有代码编号的定义。如在spellcost.scp中写[spell10]price=120也就是说,学习SPELL_EFFECT_HEAL(在defines.scp中的208行)需要120铜币。)
--------------------------------------------------------------------------
emu文件
[system]
server_name=LocalServer——>服务器名称
server_rules=PvP
http_host=127.0.0.1——>HTTP注册页面(需先搭建IIS服务器)
http_port=8080
rs_host=127.0.0.1——>填你IP
rs_port=3724
ws_host=127.0.0.1——>填你的IP就对啦
ws_port=8085
world_sleep_ms=500——>照字面来看是白天的时间
network_sleep_ms=100——>那么这个就是晚上的时间啦
connection_timeout=300——>传说卡号和这个有关改小就对啦
loglevel=1
save_text_ppoints=yes——>传说修改经验倍数要改成yes
spawns_pes_distance=64.0
max_players=100——>最大玩家数
这行贴不上来——>不知道干吗的应该不能少就是了
[game]
linger=20——>刷怪间隔秒
npc_corpse_delay=60——>怪物尸体存在时间妙
autosave_time_minutes=30——>自动保存间隔秒
health_growing_rate=1——>回血率越大越块
mana_growing_rate=10——>回魔率
energy_growing_rate=10——>回能量
delete_not_used_accounts_days=0——>删除多少天未登录的帐号
[bot]
rs_host=192.168.0.1-------------->这里填本地IP
rs_port=3724
account=WAD2
password=TEST
照以上改法,传说内外网都能连上。
--------------------------------------------------------------------------
DB2Script文件夹中各scp文件含义——quests.scp篇
定义如下:
[quest编号]任务编号
name=SharptalonsClaw//任务名
desc=//任务提示
levels=2530//任务限制等级
zone=39//任务区域
quest_flags=08//任务标记类型
src_item=16305//任务完成所需物品编号
reward_xp=2450//任务奖励经验
reward_choice=60761//任务奖励物品选择:编号,数量
reward_choice=30701//同上
reward_choice=601//同上
deliver=1821//交付物品:编号,数量
reward_gold=25//任务奖励金钱:铜币
kill=610//任务需要杀目标:编号,数量
——pages.scp篇
定义如下:
[page编号]话语编号
next_page下一个话语的编号
text话语内容
——spellcost.scp篇
定义技能学习需求,含义如下:
[spell编号]//技能编号
reqspell=72//学习所需技能
price=1100//学习所需金钱,铜币
npc训练师那里的限制吧。把所有的reqspell去掉,把price都改成1……
——items.scp篇
对游戏装备的定义,含义如下:
[item编号]
skill=0//熟练度
stackable=1//可堆叠数量
name=WornShortsword//名称
class=2//类型编号,对应defines.scp中定义
subclass=7//类别编号,对应defines.scp中定义
model=1542//模型编号
quality=1//品质
buyprice=35//买入价格
sellprice=7//卖出价格
inventorytype=21//存储类型
classes=07FFF//使用职业限制
races=01FF//使用种族限制
level=2//物品等级
reqlevel=1//需求人物等级
damage=130//伤害
delay=1900//延迟
language=1//语言
material=1//表面贴图
sheath=3//属性值,这里指大武器,左手装备
rability=20//耐久度
——gameobjects.scp篇
这个文件是对游戏中出现的怪物的定义,其含义如下:
[gameobj编号]
name=OldLionStatue//怪物名
type=2//怪物类型
model=6//所用模型
sound0=43//第一种声音
sound1=73//第二种声音
汉化的话,应该是在这个文件吧
——defines.scp篇
Script文件夹中的定义,都由defines.scp文件开始。这里定义了几乎所有东西的编号。首先我们来看看这个文件的内容。
按顺序是:
races节:定义种族编号。
classes节:定义职业编号。
powers节:定义能量类型编号。
classes节:(注意和前面的区分)定义装备类型编号。
subclasses节:定义装备类别编号。
itemtypes节:定义物品编号。
(ps:前面三个地方很容易搞混,不知道写的时候是怎么想的*_*)
sheathtypes节:定义武器属性编号,如单手,双手
slots节:定义饰品编号
creaturetypes节:npc类型编号
(接下来的节没有名称,汗!我们以数字n来代替)
1节:世界语言定义编号
2节:技能(魔法)效果编号定义
3节:技能(魔法)动作模型编号定义
4节:人物状态编号定义
5节:游戏物品(城市中)编号定义
6节:表情编号定义
7节:人物动作动画编号定义
8节:物品动画编号定义
9节:(不是很明白)推测是砍人动作动画的编号定义
10节:似乎是射箭动作动画的编号定义
11节:锁类型编号
12节:技能训练师的编号定义
这个文件中定义了游戏世界中几乎所有东西的编号,在下面的文件中出现的编号,都可以在这里找到。要注意的是,编号采用了2种方式。
首先是在每一节下面都是从1开始编号的。对应的调用应该是在scp文件中对应变量,写出这个编号。如spell,在spellcost.scp文件中,写[spell1]就表示这个魔法的效果对应2节下的编号1,同时对应3节下的编号1。
第二种是几节都拥有顺序的编号,7至10节的动画编号定义就是这样。在第7节中,是写出了0x0一直到0x86,8节中之写出了0x87,后面应该是使用得偏移量写的,如8节中写1就表示0x88。以此类推。
——classes.scp篇
classes.scp包含对于种族的初始化定义。以暗夜精灵为例,其含义如下:
startmap=1//Kalimdor出生地图编号
startzone=14//Teldrassil出生地点编号
startpos=10311.3832.4631326.411.0出生地点位置
startstats=1725192020//Str,Agi,Stm,Int,Spr初始化属性值
bodymale=55推测是男性身体高度值
bodyfemale=56推测是女性身体高度值
skill=98300300//Language:Common指种族语言
spell=668//Language:Common指spell编号
skill=113300300//Language:Darnassian指种族语言
spell=671//Language:Darnassian指spell编号
spell=019CB//Attack指spell编号
spell=81//Dodge指spell编号
skill=1621300//Unarmed
spell=203//Unarmed指spell编号
spell=20580//Shadowmeld指spell编号
spell=20582//Quickness指spell编号
spell=20583//NatureResistance指spell编号
spell=20585//WispSpirit指spell编号
//RangeAttacks远程攻击
spell=75//AutoShot指spell编号
spell=2764//Throw指spell编号
skill=451300//Bows
spell=264//Bows指spell编号
skill=461300//Guns
spell=266//Guns指spell编号
skill=1761300//Thrown
spell=2567//Thrown指spell编号
上面的定义中,spell是指数据库中技能魔法的编号,而skill是指的熟练度。但是我不明白skill中3个数值的表示是什么意思。达人指教!
——areatriggers.scp篇
areatriggers.scp文件包含世界跳转的位置。
其含义如下:
[areatrigger编号]
note=注释
pos=所属地图x坐标y坐标z坐标
topos=目标地图目标x坐标目标y坐标目标z坐标
totrigger=目标转换点
[areatrigger编号]定义转换点的编号,在totrigger中使用。
note,注释
pos,转换点所在位置
topos,目标转换点所在位置
totrigger,转换到某个转换点
一般更新都是这里的东西了看看吧也许有你想要的答案
--------------------------------------------------------------------------
如果用户被卡主,作为GM怎么办?
就是说,客户端中断了,再连接就说此用户已经在线了,不能登陆,作为GM怎么解决?
我以为刷新后就可以了,结果等了半个小时也不行,怎么办呢?
connection_timeout=300的值设置小一点,单位是秒,一般1分半到两分钟就行了!
产生新NPC的方法
先知道相应NPC模板代码比如99999
用GM账号跑到要放导师的地方:
.addspawn99999在GM站立的地方安放一个NPC的刷新点。
.setspawndist00该刷新点刷新的怪物自主移动范围为0-0
.setspawntime11该刷新点刷新怪物的时间间隔为1-1秒。
出现小人既刷新点
等几秒钟出现啦
清除刷新点的GM命令
游戏里选定你要删除的小人,输入.del
改经验:
save_text_ppoints=yes
delete_not_used_accounts_days=0
cript目录下的startup.tcl文件
setxp[expr{5*$victim_level+5}]这句
前面的5是倍数,后面的5是直接得到的经验,改哪个都可以
if{$lvldiff<=-5}{return0}
-5是怪少与你5级就没经验,你可以该多点,这样就不会打一只怪升了很多级再打没经验了
关于HP,MP及存盘不能正常设置:
1,打开DB2.0安装文件夹
2,打开scripts子文件夹
3,打开emuCONT文件,按照“办法”修改。
大家可能只是修改了主文件夹下的emuCONT,所以造成无法存盘现象。
如何保存
CTRL+C之后过几秒显示saveing的提示后会自动关闭请注意
或者GM号进游戏打.save
如何联机或者说如何做服务器让人玩
琢磨一下emu文件上面有详细解释
我想把卡号的移动到我身边该用什么命令呢?
.goname人物名-你飞到该人物身旁
.namego人物名-把该人物拉到你身旁
我想玩生产系的。请问怎么样改资源的刷新速度
举个例子来说吧:
输入
.addspawn
.setspawngo1731//加一个coppervein铜矿
.setspawntime100200//100-200秒重新生成,你改小就可以刷的快了
.setspawndist100200//每次重刷的距离在100-200尺,这可以避免矿一直出现在同一地方
server_name=LocalServer——>服务器名称
http_host=127.0.0.1——>HTTP注册页面(需先搭建IIS服务器)
delete_not_used_accounts_days=0——>删除多少天未登录的帐号
(1)服务器:先去本论坛的[服务器下载区]下载最新的JAVAWOW服务器或者WAD服务器,如果您使用的是以前的服务器版本,强烈建议你重新下载。因为技术是一个发展的过程,越新的服务器功能越强大,BUG也越少。
(2)客户端:建议购买9C发售的中文客户端,至于为什么,不说也知道的。如果你英文实在很好,好到每个物品每个NPC你都能翻译的话,那就可以不听我的劝告了。官方网站上有客户端下的。嫌下得慢的话可以去买,很便宜的。
(3)两个都安装好,不一定要在同一目录。
(4)修改客户端目录下的 realmlist.wtf (用记事本打开)文件中的 IP地址为自己的IP,例如 单机的就改成 set realmlist 127.0.0.1 要进局域网的 就改成 set realmlist xxx.xxx.xxx.xxx 其中的xxx.xxx.xxx.xxx是你的局域网IP。
(5)配置你的IP设置 ,启动服务器文件夹下的 IP-Configuration.exe 修改,把所有看得的IP全改成自己的。
(5)好了,现在可以启动服务器了。主程序是WoWemu.exe或者是No Read map 1.3.1V1.8.exe。
(6)启动后会出现一个DOS窗口,稍等,......
(7)9:26:13:M:Loading world...
9:26:13:M:Loading PP...
9:26:13:M:done, 365635 ppoints.
好了,到这里就完全启动好了。
(8)打开http://你的IP:8080 注册账号。单机的话是http://127.0.0.1:8080,也可以用服务器文件夹下的Account Creator.exe 创建账号和GM账号。
(9)局域网玩家要进你的服务器的机器,必须按第四步中的方法修改
set realmlist 你的IP 。
(10)好了,邀请你的好友一起体验吧
. usr hp 〈hp〉 〈max hp〉 : 改变HP选择的用户唯一.
.usr mana 〈mana〉 〈max mana〉 : 改变选择的用户mana .
.usr gold 〈num〉 : 改变选择的用户金钱..usr lvl 〈num〉 : 改变选择的用户的标准.
.usr speed 〈num max 30〉 : 改变选择的用户的speed.
.usr wspeed 〈num max 30〉 : 改变选择的用户的wspeed.
.usr scale 〈num .02-4〉 : 改变选择的用户的 scale.
.usr mount 〈id 1-64〉 : 改变选择的用户的登入.
.usr exp 〈exp〉 : 改变选择的用户的EXP.
.usr aura 〈aura id〉 : 改变选择的用户的aura.
.usr spell 〈spell id〉 :增加一个咒语 .
.usr skin 〈skin id〉 : 改变选择的用户的Skin.
.usr talentxp 〈num〉 : 增加天分点.
.gm pass 〈oldpass〉 〈newpass〉 : 改变您真正的通行证为帐户lvl .
.gm off : 取消显示〈GM〉用户
.gm on : 增加显示〈GM〉用户
.gm kick 〈name〉 : 踢命名的用户.
.gm save : 保存.
.gm announce 〈message〉 : 寄发一则消息到世界.
.move where : 移动您给的座标.
.move there 〈name〉 : 移动到命名的用户.
.move here 〈name〉 : 移动命名的用户到您着.
.move fast 〈x〉 〈y〉 〈z〉 :向您座标移动.
.move world 〈x〉 〈y〉 〈z〉 〈m〉 :向您座标移动和地图.
.move town 〈town〉 : 移动您键入的镇.
.move prog : 移动您向程序员小岛.
.move isle :移动您向管理员小岛.
.npc info :显示信息在选择的npc .
.npc mobs 〈modelid〉 〈npcflags〉 〈faction〉 〈level〉 〈name〉 : 产生NPC在你的位置.
.npc taxi : 增加一辆出租汽车.
.npc spell 〈spellid〉 〈price〉 :增加一个咒语来教练员NPC .
.npc rmvspell 〈spellid〉 :从教练员取消咒语NPC .
.npc item 〈itemid〉 〈amount〉 :增加一个项目来教练员NPC .
.npc rmvitem 〈itemid〉 :从教练员去除项目NPC .
.npc itemmove 〈srcslot〉 〈dstslot〉 : 搬入项目贩卖者NPC .
.npc delete :删除NPC.
.npc level 〈level〉 : 改变选择的NPC 的标准.
.npc skin 〈skinid〉 : 改变选择的NPC 皮肤.
.npc faction 〈faction〉 :改变选择的NPC 的派别.
.npc name 〈name〉 :更改选择的NPC 的名字.
.npc flag 〈flag〉 : 改变选择的NPC 旗子.
.npc animfreq 〈frequency〉 : 改变选择的NPC 频率.
.npc random 〈num 0-1〉 :集合任意开关选择的NPC .
.npc addmove :增加一个小站或设置NPC.
.npc run 〈num 0-1〉 : 设置奔跑开关选择的NPC .
.npc state 〈num 0-2〉 :设置如果选择的NPC NPC 意志自动攻击.
.npc scale 〈num〉 :选择的NPC集合scale.
.npc hpmin 〈num〉 : 设置选择的NPC最小HP .
.npc hpmax 〈num〉 : 设置选择的NPC最大HP .
.admin ban 〈name〉 :禁令命名的用户从服务器
.admin lvl 〈name〉 〈lvl account〉 :改变命名的用户lvl 帐户.
.admin addspirit : 增加一种Spirit来世界.
.admin die :使用户死
.admin revive :使用户复活
.admin update 〈old〉 〈new〉 : 更新Opcodes
.addgo : 在你的坐标添加游戏对象
.add : 添加项目到你的背包中.
.addnpc : 添加NPC到游戏.
.del : 删除目标NPC
.setlevel : 设置个人或NPC的等级
.setmodel : 给NPC或个人设置模型数量.
.learn : 学习魔法的数目
.save : 保存文件.
.rehash : 改写目标.
.flag1 : 设置有毛病的标记.
.ppon : 打开pp系统.
.ppoff :关闭pp系统.
.turn : 转动NPC面朝你.
.come : NPC来到你的位置.
.go : 去世界坐标.
.gotrigger: 进入世界范围的位置,参数: trigger_number
.kill : 杀死选择的NPC或个人.
.killallnpc : 杀死所有的NPC的形象.
.resurrect : 复活选择的个人.
.setsize : 设置NPC的大小.
.setspeed : 设置NPC或个人的速度
.setflags : 设置NPC或O.G的面具. 参数: 〈ftype〉 〈flags〉
.addspawn : 添加大量的点到你的位置. 参数 : [〈npc entry〉] [〈npocs number〉]
.setnpcspawn : 添加条目和数目作成大量NPC到大量的点
.setnpcgo : 设置条目由于大量游戏目标到大量点
.setspawndist : 设置小和大距离到大量
.setspawntime : 设置小和大的时间到大量.
.setxp : 设置经验到个人.
.paralyse : 不动和动到个人或NPC.
.setaura : 设置预兆数目
.exploration : 打开你地图的位置.
.dismount : 卸下你.
.listsp :列出你的魔法.
.listsk :列出你的技能.
.delsp : 忘记魔法
.delsk : 忘记技能.
.info : 附近NPC的信息.
.online : 显示在线玩家数目
.goname : 移动到输入名字的个人或NPC.
.goguid : 移动到行会.
.targetgo : 尝试移动到最近的玩家(定位最近的object)
.targetlink : 尝试到连接目标OF选择目标
.move :传送目标.
.retcl : 重装TCL
.rescp : 重装 SCP.
.clearqflags : 清楚寻找标记
.bytes : for debug
.pingmm : 制造点在你的地图
.adddyn : 测试到竞技
1.架设服务器必须安装的NET Framework 2.0.exe
2.首先修改服务端内的wowemu.key文件
server_name=Dokj 这行是服务器名称,假如要中文,请先用"汉字转"转换下
ws_host=127.0.0.1 这里是服务器IP,可以用域名
ws_port=8085
3.然后打开maps文件夹,运行BatCreator.exe,然后选择Locate the folder with wow.exe指定一下客户端的路径,选好后按一下Create,再按Extract,中途需要按两次y确认,第二次输入y以 后窗口会自动关闭.
4.接下来打开scripts文件夹内的emu.conf文件,用记事本打开
[banned]
//ip=127.0.0.1/255.255.255.0 在127.0.0.1的地方输入IP,默认是单机的
5.账号可以通过服务端自带的DButil.exe程序进行添加,打开后选择
Edit Accounts,方法是:Find的左边的空格内输入账号,password是密码,plevel
是GM权限等级,6是最高,然后按一下Add就可以了(注意:添加账号必须在服务器开启以后才行)
6.运行服务端程序WoWemu.exe,等待一段时间后,服务器就开好了.
7.客户端需要打补丁.我试过不打补丁就出现版本无法严正的错误
把"登陆器"解压到客户端,然后运行"SF补丁安装程序.bat",结束以后.用记事本打开realmlist.wtf,修改里面的IP,改成你的服务器IP,改完后运行wow.exe就可以进入游戏了,别忘了启动游戏后用DButil.exe添加账号..
8.这是最重要的一点.请大家每次关闭服务器之前.输入".save"保存一下,不然下次开F以后所有东西都会没有的,比如账号..切记!!!!!!
㈨ python有1000个url请求 放到queue 再十个线程 这样输出的数据是乱的 必须加锁么
题主的问题表述不清,尤其十个线程做了哪些工作没说明,我从字面猜测,是把1000个url放在队列里,然后十个线程从队列中取出url,请求之后,调用输出函数。
先说队列的问题,通常的设计里,queue只在添加元素,摘取元素的时候内部加锁,以保证队列数据不出错,至于从queue中取出数据后怎么处理,要不要放临界区,queue是不管的,也不应该管,python的Queue模块提供了相应的Queue类。
再说输出结果是乱的,又是表述不清,如果你指的是最终输出到一个文件里,文件内容乱了,那给你4种解决办法:
1. 线程里每个url在请求到内容后,在写文件时设立临界区,保证串行输出,强烈不建议这种方式。
2. 对每个url的请求内容写一个文件,最后合并文件,这种最灵活。
3. 对每个工作线程的输出写一个文件,最后合并文件,最有并行style
4. 对每个url的请求内容再次写到一个队列里,另一个线程读取此队列写文件,最有设计模式style
如果你要保证输出结果是与输入url同序的,建议你采用上面第2种办法,合并文件的时候保证与url队列同序
㈩ Python 包管理工具
Python之所以受欢迎不光是因为它简单易学,更重要的是它有成千上万的宝藏库。这些库相当于是已经集成好的工具,只要安装就能在Python里使用。它们可以处理各式各样的问题,无需你再造轮子,而且随着社区的不断更新维护,有些库越来越强大,几乎能媲美企业级应用。那么这些工具库怎么下载安装呢?它们被放在一个统一的“仓库”里,名叫PyPi(Python Package Index),所有的库安装都是从这里调度。有了仓库之后,还需要有管理员,pip就是这样一个角色。
pip 是 Python 中的标准库管理器,这意味着它是一个工具,用它可以来管理 Python 标准库中其他的包,允许你安装和管理不属于 Python 标准库的其它软件包,其提供了对 Python 包的查找、下载、安装、卸载等功能。总的来说,pip的Python第三方库的大管家,搞懂它,会让你省很多事。从Python 3 >= Python 3.4 、Python2 >= Python2.7.9 版本开始,pip默认包含在Python的安装程序中,在安装Python时将会自动被安装,省事方便。
Python 的安装器中自带了 pip,所以你可以直接使用它,除非你安装的是更早版本的 Python。你可以通过以下命令来判断是否已安装:
如果你的 Python 环境没有安装 pip,则可以使用以下方法来手动安装。pip 安装文件下载: pypi.org/project/pip…
pip提供的命令不多,但是都很实用
pip命令默认使用的是国外的pypi镜像(pypi.python.org),安装慢不说,有时甚至会导致出现超时等网络问题,有时候为了安装一个包,失败重试安装好几次都不一定成功。所以,使用国内的pypi镜像,亦即 切换 pip 源 ,这样速度上更有保证,不失为一种加速pip安装第三方包的好方法。常用的镜像站有阿里云、清华大学等。其中清华大学开源软件镜像站是每 5 分钟同步一次的,比较推荐使用。阿里云镜像站的速度也非常快,这也是我现在在使用的。
切换切换 pip 源可以是临时性的,也可以设置为默认。临时性的,就是在安装包时,通过pip命令的 -i 选项指定镜像源即可。例如,临时使用阿里云镜像站作为 pip 源,可以是这样安装:
如果每次安装时都想要通过镜像源来安装,上面的办法不免有些麻烦。我们可以修改pip的配置文件,将镜像源写入到 pip 配置文件中。 对于linux系统 ,修改 ~/.pip/pip.conf 文件 (没有就创建一个文件夹及文件,文件夹要加“.”,表示是隐藏文件夹):
然后在文件中保存如下内容:
对于windows系统 ,在C:Users文件夹下的用户目录(例如如果当前用户是Administrator则是C:UsersAdministrator)下创建pip文件夹,然后再在此文件夹下创建pip.ini文件,在文件中写入一下内容:
配置完成后再通过 pip config list 查看pip配置。
我们经常会遇到这样的开发需求,比如你手头有多个开发项目,其中项目A要求用python3.7,项目B需要用python3.6,有要求项目A和项目B依赖包相互独立,互不干扰。为了满足这样的开发需求,我们需要在自己的电脑上安装多个Python版本,并且项目之间进行环境隔离。因此,我们要想运行这些项目,在工作电脑上就要安装不同版本的Python。 pyenv 是Python版本管理工具,通过系统修改环境变量来实现Python不同版本的切换,利用它可以在同一台电脑上安装多个版本的Python,设置目录级别的Python,还能创建和管理vitual python enviroments。而且所有的设置都是用户级别的操作,不需要sudo命令。
首先安装pyenv,如果你是Mac电脑,那么推荐使用Homebrew来安装。
要想升级pyenv,则可以执行:
pyenv安装完成后,需要将$HOME/.pyenv/bin添加到PATH变量前面,这一步非常关键。
也可以采用手动安装的方式,将pyenv检出到你想安装的目录。
添加环境变量,将PYENV_ROOT 指向 pyenv 检出的根目录,并向 $PATH 添加 $PYENV_ROOT/bin 以提供访问 pyenv命令的路径。这里的 shell 配置文件(~/.bash_profile)依不同系统而需作修改,如果使用 Zsh 则需要相应的配置 ~/.zshrc
在使用 pyenv 之后使用 pip 安装的第三方模块会自动安装到当前使用 python 版本下,不会和系统模块产生冲突。使用 pip 安装模块之后,如果没有生效,记得使用 pyenv rehash 来更新。
安装完pyenv,可以安装Python,首先查看可安装的Python版本:pyenv install -l,接下来开始安装Python
执行命令 pyenv versions 查看安装结果。
可以看到,已经成功安装了Python,安装的位置在 /Users/dllwh/.pyenv。
可以看到,3.9.9 前面有一个星号,说明成功切换到了 3.9.9 版本,可以执行一下python来验证。
Pipenv 是 Python 官方推荐的包管理工具,它综合了 virtualenv、pip 和 pyenv 三者的功能,你可以使用 pipenv 这一个工具来安装、卸载、跟踪和记录依赖性,并创建、使用和组织你的虚拟环境。
如果你是Mac电脑,那么推荐使用Homebrew来安装和升级pipenv:
也可以通过pip来安装和升级pipenv:
进入到项目目录中,通过下面的指令为项目创建虚拟环境。
上面的操作,给pipenv_demo这个项目初始化了一个 Python 3.9.9 的虚拟环境,并在项目录下生成一个项目依赖包文件 Pipefile。如果系统中没有 3.9.8 版本的Python,pipenv 会调用 pyenv 来安装对应的 Python 的版本。默认地,虚拟环境会创建在 ~/.local/share/virtualenvs目录里面。我们也可以通过 pipenv --venv查看项目的虚拟环境目录。可以通过 pipenv --rm 删除虚拟环境。
如果想更改虚拟环境的目录,可以在 .bashrc 或 .bash_profile 中,设置环境变量WORKON_HOME,指定虚拟环境的目录所在位置,比如想将虚拟环境放到~/.venvs目录,则可以执行下面的命令。
如果希望在项目目录下创建虚拟环境目录(.venv),需要在 .bashrc 或 .bash_profile 中配置环境变量PIPENV_VENV_IN_PROJECT:
pipenv使用 Pipfile 和 Pipfile.lock 来管理依赖包,并且在使用pipenv添加或删除包时,自动维护 Pipfile 文件,同时生成 Pipfile.lock 来锁定安装包的版本和依赖信息。相比pip需要手动维护requirements.txt 中的安装包和版本,具有很大的进步。
为项目安装依赖包到虚拟环境中,使每个项目拥有相互独立的依赖包,是非常不错的Python的开发实践。安装依赖包到虚拟环境中的方法:
执行完上面的命令后,检查一下是否安装成功:
观察项目的根目录下,又多了一个 Pipfile.lock 文件。这两个文件记录了此项目的依赖包,这两个文件的区别是 Pipfile 中安装的包不包含包的具体版本号,而Pipfile.lock 是包含包的具体的版本号的。如果不想产生 Pipfile.lock 文件,在安装依赖包的时候,加上 –skip-lock 选项即可。
在使用pipenv的时候,常常会安装过程比较慢,这个是因为pipenv创建的 Pipfile 中默认的Pypi源是python官方的 pypi.python.org/simple。我们国内…
为了避免每次都要指定–pypi-mirror,我一般会在创建好Pipfile以后,将文件中 source 块下的 url 字段,设置为国内的 pypi 源,我推荐的是清华的Pypi源或者阿里源,具体设置如下:
如果是要删除虚拟环境中的第三方包,执行:
用git管理项目时候,要把Pipfile和Pipfile.lock加入版本跟踪。这样clone了这个项目的同学,只需要执行:
就可以安装所有的Pipfile中 [packages]部分列出来的包了,并且自动为项目在自己电脑上创建了虚拟环境。
上面的方法都是安装Pipfile中列出来的第三方包的最新版本,如果是想安装Pipfile.lock中固定版本的第三方依赖包,需要执行:
如果项目之前使用requirements.txt来管理依赖的,那么使用pipenv安装所有依赖可以采用类似pip的方法:
虚拟环境创建好了之后,就可以在里面进行开发了。如果在命令行下开发,则在项目目录下执行 pipenv shell ,就进入到了虚拟环境中,在这个环境中,已经包含安装过的所有依赖包了,接下来就可以利用这些依赖包进行开发工作了。如果是用Pycharm进行开发,就更简单了,直接用Pycharm打开项目即可。可以从Pycharm中的左侧导航栏里面看到External Libraries显示的是虚拟环境中的Python解释器了。
在虚拟环境中执行开发好的程序,有两种方式,一种是前面提到的先执行pipenv shell进入到虚拟环境后,再执行python程序;另一种方式,则是执行pyenv run,比如在虚拟环境中执行基于pytest框架编写的测试用例,只需要执行下面的命令即可:
作者:独泪了无痕
链接:https://juejin.cn/post/7063699409703272485