【发布时间】:2015-06-25 12:15:05
【问题描述】:
我对 Python 比较陌生,最后一次接触 C 中的线程和进程大约是 7 年前,所以请在您的回复中将我视为新手。
我在 Linux 上使用 Python 2.7.6。
我正在尝试查询(稍后从其中下载)一个在线存档,该存档仅允许每个注册用户进行一个连接,而且速度很慢。它有自己的查询 API,所以我不会深入讨论。我打算在并行线程中执行查询和下载,每个用户帐户一个。 (郑重声明我没有作弊,所有账号都是正版用户!)
accounts = ['user1','pass1','user2','pass2'...]
queries = ['query1','query2','query3',..., 'queryN' ]
numQueries = len(queries)
numAc = len(accounts)/2
if numQueries < numAc:
nThreads = numQueries
else
nThreads = numAc # most likely situation
# example of function for the query
def runQuery(user, passw, query):
# here's the API bit
我看到的每个示例都运行在一个列表上。
所以,我很茫然。如果我们忘记所有关于帐户和约束并且只是运行不同的查询,我可以看到它会如何工作。
如何为每个帐户设置一个线程并遍历查询/下载列表?记住我使用的是 2.7。
我也被线程/进程问题弄得不知所措,因此希望您能清楚地回答。
--- 编辑 - 由于下面评论中的代码不可读,这是我尝试过的:
ulock = thread.allocate_lock()
def runQuery(userQueue, ulock, queryQueue):
query = queryQueue.get()
with ulock:
user = userQueue.popleft()
userQueue.append(user)
passw = userQueue.popleft()
userQueue.append(passw)
print 'The executed query will use: ' + user + ' ' + passw + ' ' + ' ' + query + '\n'
for t in nThreads:
thread.start_new_thread(runQuery, (userQueue, ulock, queryQueue,))
【问题讨论】:
-
我通常避免使用
pass作为变量名(在runQuery函数签名中),因为它是Python 中“什么都不做”的关键字。以后你用passw,效果会好很多。 -
您也可以为每个用户创建一个新的
multiprocessing.Process,然后开始上述过程?这是一个很好的解释,从你的角度来看,如果你选择线程或进程,我认为这没有任何区别:*.com/questions/17172878/…
标签: python multithreading python-2.7