python - Python 在多处理期间更新数据库
问题描述
我正在使用多处理来并行执行作业,我的目标是使用多 cpu 核心,因此我选择了多处理模块而不是线程模块
现在我有方法,它使用子进程模块来执行 linux shell 命令,我需要过滤它并将结果更新到 DB。
对于每个线程,子进程的执行时间可能不同,一些线程的输入执行时间可能是 10 秒,而另一些可能是 15 秒。
我担心的是总是会得到相同的线程执行结果或不同的线程执行结果,
或者我必须去锁定机制,如果是的话,你能给我提供适合我要求的例子吗
下面是示例代码:
#!/usr/bin/env python
import json
from subprocess import check_output
import multiprocessing
class Test:
# Convert bytes to UTF-8 string
@staticmethod
def bytes_to_string(string_convert):
if not isinstance(string_convert, bytes) and isinstance(string_convert, str):
return string_convert, True
elif isinstance(string_convert, bytes):
string_convert = string_convert.decode("utf-8")
else:
print("Passed in non-byte type to convert to string: {0}".format(string_convert))
return "", False
return string_convert, True
# Execute commands in Linux shell
@staticmethod
def command_output(command):
try:
output = check_output(command)
except Exception as e:
return e, False
output, state = Test.bytes_to_string(output)
return output, True
@staticmethod
def run_multi(num):
test_result, success = Test.command_output(["curl", "-sb", "-H", "Accept: application/json", "http://127.0.0.1:5500/stores"])
out = json.loads(test_result)
#Update Database is safer here or i need to use any locks
if __name__ == '__main__':
test = Test()
input_list = list(range(0, 1000))
numberOfThreads = 100
p = multiprocessing.Pool(numberOfThreads)
p.map(test.run_multi, input_list)
p.close()
p.join()
解决方案
取决于您在数据库中执行的更新类型...
如果它是一个完整的数据库,它将有自己的锁定机制;您需要使用它们,但除此之外,它已经设计为处理并发访问。
例如,如果更新涉及插入一行,您可以这样做;数据库将以所有行结束,每行恰好一次。
推荐阅读
- automation - 基于 Web 的应用程序中的 Pcom 自动化
- vue.js - 作为道具传递给子组件的绑定数据在承诺后不会更新
- css - 如何使可滚动区域高度为 100% 的 div
- android - 如何获取自定义数据
- javascript - 如何在 Javascript 中获取此关键字的类型?
- haskell - haskell stack install 报告了一个模棱两可的声明
- c - C链表如何删除节点
- python - 双向 websocket 连接。触发服务器到客户端的消息
- git - 尝试将代码推送到 GitHub 时没有任何反应
- python-3.x - 使用函数创建 4 个具有不同字段和配色方案的 matplotlib 子图时出现问题