[英]Proper Way To Import And Manipulate Objects In Multiprocessing Pool?
我有一个非常简单的多处理脚本,无法开始工作。
我需要做的是:
这些过程相互冲突。 我尝试了很多事情,例如使用lock(),并将所有内容都通过map传递,但是我无法正常工作。
这是代码
from multiprocessing import Pool, Lock
counter = 0
msg_list = ["message1", "message2", "message3", "message4", "message5", "message6", "message7", "message8", "message9", "message10", "message11", "message12"]
def increment(item):
global counter
global msg_list
print(counter, item, msg_list[counter])
counter = counter + 1
if __name__ == '__main__':
item_list = ["item1",
"item2",
"item3",
"item4",
"item5",
"item6",
"item7",
"item8",
"item9",
"item10",
"item11",
"item12"]
p = Pool(4)
p.map(increment, item_list)
p.terminate()
输出应如何显示:
0 item1 message1
1 item2 message2
2 item3 message3
3 item4 message4
4 item5 message5
5 item6 message6
6 item7 message7
7 item8 message8
8 item9 message9
9 item10 message10
10 item11 message11
11 item12 message12
当前输出的外观
0 item1 message1
1 item2 message2
2 item3 message3
3 item4 message4
4 item6 message5
0 item5 message1
5 item7 message6
1 item8 message2
6 item9 message7
7 item10 message8
2 item11 message3
8 item12 message9
在Windows上,除非您设置共享内存,否则进程不会共享任何进程空间。 而且python的共享内存很尴尬,因为任何共享数据仍然需要包装在python对象中。
创建池后,辅助进程将启动一个新的python实例,然后对父进程的状态进行酸洗,发送给工作器并取消酸洗。 这可能是昂贵的操作。 通常目标是使进程间通信与正在执行的cpu工作相比保持较低的状态。
从您的笔记中,我认为msg_list
确实是从网页上msg_list
的东西。 很好! 以下是将抓取推入工作进程的总体概述:
import multiprocessing as mp
if __name__ == "__main__":
# imports not needed in worker
import pandas as pd
def worker(url):
import requests
try:
data = requests.get(url)
interesting = do_your_scraping()
return = format_for_pandas(interesting)
except AnyExceptionsYouShouldCatch:
return default_payload # whatever you want an error
# to look like
def main():
import pandas
with open("file_with_urls.txt") as urls_file:
urls = [line.strip() for line in urls_file]
with mp.Pool(4) as pool:
df = pd.DataFrame(pool.map(worker, urls, chunksize=1)
由于花费大量时间等待远程Web服务器响应,因此如果确实需要工作人员之间的通信,请考虑使用线程池。 一次只能运行一个线程,但是如果大多数线程在等待远程时被阻塞,那么它仍然可以正常运行。
还要考虑那里有像scrappy
这样的web抓取工具。 您可能会发现它适合您的需求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.