Python并行执行-threading.Lock无法按预期工作
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python并行执行-threading.Lock无法按预期工作,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1570字,纯文字阅读大概需要3分钟。
内容图文
![Python并行执行-threading.Lock无法按预期工作](/upload/InfoBanner/zyjiaocheng/676/36bb1538f78d4d53bdda2d0158296a50.jpg)
我目前有一个全局Lock = threading.Lock(),并进行以下调用:
Parallel(n_jobs=2)(delayed(serialRemove)(dir,c,b,l,f) for f in os.listdir(dir))
使用jobLib.在serialRemove中,我有
Lock.acquire()
print(f+' begin')
if h in hashes:
try:
os.remove(path)
if l: print('Removing ' + path)
removed += 1
except os.error:
print('Encountered error removing file')
else:
hashes.add(h)
print(f+' end')
Lock.release()
部分通话结果是:
10.txt开始
11.txt开始
20.txt开始
如果我将代码放在锁中,我不知道怎么会有两个开始打印.有什么简单的方法可以保护代码块,所以理想情况下我可以得到:
10.txt开始
10.txt结尾
11.txt开始
11.txt结尾
20.txt开始
20.txt结尾
解决方法:
threading.Lock仅在同一进程的线程之间起作用.
在这里,实际上不知道您要使用哪个库进行并行处理,这很难确定,但是几乎可以肯定,它是在单独的进程中执行任务的. (由于存在GIL,因此至少在CPython中,任何在同一进程中启动线程的操作都不会对CPU绑定的代码获得任何有效的并行性.因此,它们都没有这样做.)
因此,如果您尝试使用其他进程中的全局threading.Lock对象,则将在每个进程中获得完全独立的锁.因此,锁定它没有任何好处. (使用一些并行库(在每个平台上可能有所不同),您会得到一个错误消息.但是,它不可能完成您想要的操作.)
大多数并行化库都有自己的锁类型,可以与它们的多处理方式配合使用.如果是这样,请使用您的磁带库随附的那个.
如果没有,则取决于您的库的工作方式,multiprocessing.Lock可能会成功.
如果不是这样,您将必须使用例如锁文件(可能与flock / lockf一起使用,或者依赖于Windows独占打开等)来显式实现某些功能.
另外,请注意,多个库中至少有一个具有可以使您的示例代码行[joblib]有意义的API,它是专为没有任何共享的任务而设计的,因此不应使用完全没有锁. (它可能会与多处理一起使用.无论如何,请锁定,但您实际上不应指望这一点.)
内容总结
以上是互联网集市为您收集整理的Python并行执行-threading.Lock无法按预期工作全部内容,希望文章能够帮你解决Python并行执行-threading.Lock无法按预期工作所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。