我希望能够运行多个线程,而无需为每个要运行的线程实际生成新行。在下面的代码中,我不能动态地添加更多的accountid,也不能仅仅通过更改线程计数来增加线程数
例如,这是我现在的代码:
import threading
def get_page_list(account,thread_count):
return list_of_pages_split_by_threads
def pull_data(page_list,account_id):
data = api(page_list,account_id)
return data
if __name__ == "__main__":
accountIDs = [100]
#of threads to make:
thread_count = 3
#Returns a list of pages ie : [[1,2,3],[4,5,6],[7,8,9,10]]
page_lists = get_page_list(accountIDs[0],thread_count)
t1 = threading.Thread(target=pull_data, args=(page_list[0],accountIDs[0]))
t2 = threading.Thread(target=pull_data, args=(page_list[1],accountIDs[0]))
t3 = threading.Thread(target=pull_data, args=(page_list[2],accountIDs[0]))
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
这就是我想去的地方:
每当我想添加一个额外的线程,如果服务器可以处理它或添加额外的accountid,我不必复制代码?你知道吗
IE(这个例子是我想做的,但是下面的不起作用,它试图在进入下一个线程之前完成一个完整的页面列表)
if __name__ == "__main__":
accountIDs = [100,101,103]
thread_count = 3
for account in accountIDs:
page_lists = get_page_list(account,thread_count)
for pg_list in page_list:
t1 = threading.Thread(target=pull_data, args=(pg_list,account))
t1.start()
t1.join()
一种方法是使用
Pool
和Queue
。你知道吗当队列中有项目时,池将继续工作,而不保留主线程。你知道吗
选择以下导入之一:
创建工人、池和队列:
另一个选项是先填充队列,然后创建池,仅当队列中有项目时才使用辅助进程。你知道吗
然后,如果有更多数据到达,则创建另一个队列、另一个池:
我不能让MP正常工作,所以我做了这个,而它似乎工作得很好。但MP可能是解决这个问题的更好方法
我也不明白为什么你会“需要”。join()很好的答案是: what is the use of join() in python threading
相关问题 更多 >
编程相关推荐