Python 3.x Python3中的线程
我编写了python3代码,其中有两个函数。第一个函数insertBlock()在MongoDB集合1中插入数据,第二个函数insertTransactionData()从集合1中获取数据并将其插入集合2中。数据量非常大,所以我使用线程来提高性能。但是当我使用线程时,插入数据比不使用线程要花更多的时间。我很困惑,到底线程将如何在我的代码中工作,以及如何提高性能?以下是主要功能:Python 3.x Python3中的线程,python-3.x,mongodb,python-multithreading,Python 3.x,Mongodb,Python Multithreading,我编写了python3代码,其中有两个函数。第一个函数insertBlock()在MongoDB集合1中插入数据,第二个函数insertTransactionData()从集合1中获取数据并将其插入集合2中。数据量非常大,所以我使用线程来提高性能。但是当我使用线程时,插入数据比不使用线程要花更多的时间。我很困惑,到底线程将如何在我的代码中工作,以及如何提高性能?以下是主要功能: if __name__ == '__main__': t1 = threading.Thread(targe
if __name__ == '__main__':
t1 = threading.Thread(target=insertBlock())
t1.start()
t2 = threading.Thread(target=insertTransactionData())
t2.start()
从python文档中获取: target是run()方法调用的可调用对象。默认为“无”,表示不调用任何内容 所以正确的用法是
threading.Thread(target=insertBlock)
(在insertBlock
之后没有()
),因为否则会调用insertBlock
,正常执行(阻塞主线程),并且target
设置为其返回值None
。这会导致t1.start()
什么都不做,而且性能也不会得到任何改善
警告:
请注意,多线程无法保证不同线程中的执行顺序。您不能依赖
insertTransactionData
函数中插入数据库的insertBlock
数据,因为在insertTransactionData
使用此数据时,您无法确定它是否已插入。因此,对于这段代码,可能多线程根本不起作用,或者您需要重新构造代码,只对互不依赖的部分进行并行化。来自python文档:
target是run()方法调用的可调用对象。默认为“无”,表示不调用任何内容
所以正确的用法是
threading.Thread(target=insertBlock)
(在insertBlock
之后没有()
),因为否则会调用insertBlock
,正常执行(阻塞主线程),并且target
设置为其返回值None
。这会导致t1.start()
什么都不做,而且性能也不会得到任何改善
警告:
请注意,多线程无法保证不同线程中的执行顺序。您不能依赖
insertTransactionData
函数中插入数据库的insertBlock
数据,因为在insertTransactionData
使用此数据时,您无法确定它是否已插入。因此,可能多线程对这段代码根本不起作用,或者您需要重新构造代码,只并行化互不依赖的部分。我通过将这两个功能合并为一个新功能解决了这个问题
insertBlockAndTransaction(开始、结束范围)
。由于这两个功能相互依赖,所以我所做的是在插入块信息的下方插入事务信息(两个功能都需要块编号)。然后通过为单个功能创建10个线程来执行多线程:
for i in range(10):
print('thread:',i)
t1 = threading.Thread(target=insertBlockAndTransaction,args(5000000+i*10000,5000000+(i+1)*10000))
t1.start()
这有助于我处理超过1lakh数据的执行时间增加的问题。我将这两个功能合并为一个新功能,从而解决了这个问题
insertBlockAndTransaction(开始、结束范围)
。由于这两个功能相互依赖,所以我所做的是在插入块信息的下方插入事务信息(两个功能都需要块编号)。然后通过为单个功能创建10个线程来执行多线程:
for i in range(10):
print('thread:',i)
t1 = threading.Thread(target=insertBlockAndTransaction,args(5000000+i*10000,5000000+(i+1)*10000))
t1.start()
这有助于我处理超过1lakh数据的执行时间增加的问题。谢谢您的回复。但是如果我这样做,我会得到一个错误:thread-2中的异常:Traceback(最后一次调用):File“/usr/lib/python3.6/threading.py”,第916行,在内部self.run()文件“/usr/lib/python3.6/threading.py”,第864行,在运行self中,在blockResult[“transactions”]中用于发送的insertTransactionData中:TypeError:“非类型”对象不可用subscriptable@VarshaKhandre这是
insertTransactionData
(blockResult
是None
)中的一个问题,您没有包含该部分代码。请阅读我的编辑,了解多线程的问题,并了解并行化(这是您的目标)。如果您仍然需要该问题的帮助,请打开一个新问题。谢谢您的回复。但是如果我这样做,我会得到一个错误:thread-2中的异常:Traceback(最后一次调用):File“/usr/lib/python3.6/threading.py”,第916行,在内部self.run()文件“/usr/lib/python3.6/threading.py”,第864行,在运行self中,在blockResult[“transactions”]中用于发送的insertTransactionData中:TypeError:“非类型”对象不可用subscriptable@VarshaKhandre这是insertTransactionData
(blockResult
是None
)中的一个问题,您没有包含该部分代码。请阅读我的编辑,了解多线程的问题,并了解并行化(这是您的目标)。如果您仍然需要帮助解决该问题,请打开一个新问题。