2017-11-08 9 views
0

これは、URLのローカルホストを呼び出すプログラム入力複数のURLです:8888/API/V1 /クローラーPythonプログラムの呼び出しが

に1 +時間を取って、このプログラムokを実行するが、他のapiをブロックする。 それはので、私はので、どのように私は

@tornado.web.asynchronous 
    @gen.coroutine 
    @use_args(OrgTypeSchema) 
    def post(self, args): 
     print "Enter In Crawler Match Script POST" 
     print "Argsssss........" 
     print args 
     data = tornado.escape.json_decode(self.request.body) 
     print "Data................" 
     import json 
     print json.dumps(data.get('urls')) 
     from urllib import urlopen 
     from bs4 import BeautifulSoup 
     try: 
       urls = json.dumps(data.get('urls')); 
       urls = urls.split() 

       import sys 

       list = []; 

       # orig_stdout = sys.stdout 
       # f = open('out.txt', 'w') 
       # sys.stdout = f 
       for url in urls: 
        # print "FOFOFOFOFFOFO" 
        # print url 
        url = url.replace('"'," ") 
        url = url.replace('[', " ") 

        url = url.replace(']', " ") 
        url = url.replace(',', " ") 
        print "Final Url " 
        print url 
        try: 
         site = urlopen(url) .............. 

答えて

0

同じプログラムで達成することができますあなたの投稿方法は100%同期している非同期にこのプログラムを実行する既存のAPIが終わるまで、任意のAPIが動作しません、他の実行中。​​を非同期にする必要があります。竜巻にはasync HTTP clientがあります。良い例もhereです。

+0

まだ実行中の他のAPI呼び出しをブロック中 プログラムは – user2775366

+0

まだブロックされている場合は、async httpクライアントを使用して新しいコードを追加できますか? – Fian

0

これはブロックする理由であるurllibを使用しています。

Tornadoには、使用する必要があるAsyncHTTPClientという非ブロッキングクライアントがあります。私が指摘したいもう一つは、関数内からモジュールをインポートしないで

from tornado.httpclient import AsyncHTTPClient 

@gen.coroutine 
@use_args(OrgTypeSchema) 
def post(self, args): 
    ... 
    http_client = AsyncHTTPClient() 
    site = yield http_client.fetch(url) 
    ... 

はこのようにそれを使用してください。しかし、それはブロックの理由ではありませんが、すべてのインポートをファイルの先頭に置くよりもまだ遅いです。 this questionを読んでください。

関連する問題