Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python3中的线程_Python 3.x_Mongodb_Python Multithreading - Fatal编程技术网

Python 3.x Python3中的线程

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

我编写了python3代码,其中有两个函数。第一个函数insertBlock()在MongoDB集合1中插入数据,第二个函数insertTransactionData()从集合1中获取数据并将其插入集合2中。数据量非常大,所以我使用线程来提高性能。但是当我使用线程时,插入数据比不使用线程要花更多的时间。我很困惑,到底线程将如何在我的代码中工作,以及如何提高性能?以下是主要功能:

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
)中的一个问题,您没有包含该部分代码。请阅读我的编辑,了解多线程的问题,并了解并行化(这是您的目标)。如果您仍然需要帮助解决该问题,请打开一个新问题。