背景:私は7つのスレッドを生成ウェブクローラーに取り組んでいますオブジェクトがNoneTypeに生成
、それぞれがXMLファイルに一意のURLを照会します。各スレッドが開始されると、それはそれにtree
を置くことができるように
conn = http.client.HTTPSConnection(host = uHost, port = uPort)
conn.request('GET', url = '/some/url/file.xml')
resp = conn.getresponse()
tree = xml.etree.ElementTree.parse(resp)
、それは、引数としてqueue.Queue()
を与えている:各クエリが応答を受信するとそのように、それは、XMLツリーにその応答を回しますその__main__
はファイルを書き込む唯一のスレッドです。上記に引き続き:
__main__
def receive(q):
while True:
try:
uTree = q.get()
uTree.write('/some/path/file.xml')
except queue.Empty:
pass
は
conn = http.client.HTTPSConnection(host = uHost, port = uPort)
conn.request('GET', url = '/some/url/file.xml')
resp = conn.getresponse()
tree = xml.etree.ElementTree.parse(resp)
q.put_nowait(tree)
を生み出したことはしかし、私はuTree.write()
を呼び出すときAttributeError: 'NoneType' object has no attribute 'write'
を受け始めました。 print(type(uTree))
からuTree.write()
のクイックチェンジは、彼らがNoneType
なる、オブジェクトは時々そのまま残るであろうと、他の時間を示した:
<class 'xml.etree.ElementTree.ElementTree'>
<class 'xml.etree.ElementTree.ElementTree'>
<class 'xml.etree.ElementTree.ElementTree'>
<class 'xml.etree.ElementTree.ElementTree'>
<class 'NoneType'>
<class 'NoneType'>
<class 'xml.etree.ElementTree.ElementTree'>
<class 'xml.etree.ElementTree.ElementTree'>
質問:
はなぜqueue.Queue()
にthreading.Thread()
から渡されたオブジェクトは、[__main__
に居住しています]がNoneType
に一貫して変更されていませんか?
どうすれば解決できますか?
完全なコード(必要な場合):
main.py
import queue
import crawl # custom module
import threading
def crawler(query):
while True:
try:
query.connect()
break
except:
pass
def receive(q):
while True:
try:
uQuery = q.get()
uTree = uQuery.tree
uTree.write('/some/path/file.xml')
except queue.Empty:
pass
urls = ['/url1.xml', '/url2.xml', ...]
q = queue.Queue()
queries = [Query(url, q) for url in urls]
threads = [threading.Thread(target = crawler, args = (query,)) for query in queres]
for t in threads:
t.start()
receive(q)
crawl.py
import http.client
import xml.etree.ElementTree as ET
class Query:
def __init__(self, url, q):
self.url = url
self.queue = q
self.tree = None
def connect():
conn = http.Client.HTTPConnect(host = 'something.com', port = '80')
conn.request('GET', url = self.url)
resp = conn.getresponse()
self.tree = ET.parse(resp)
self.queue.put_nowait(self)
conn.close()