2017-07-14 57 views
0

Ich bin neu in Python, also bitte entschuldigen Sie meine Ignoranz. Ich versuche, einen Prozess zur gleichen Zeit wie meine Hauptdatei auszuführen. Der Anwendungsfall, den ich habe, ist, dass ich die Punkte eines Spiels (Hinzufügen/Anpassen von Punkten für alle Benutzer) gleichzeitig ändern möchte, dass meine Flasch/Python-App CRUD-Anfragen akzeptiert. I könnte wahrscheinlich nur dies für einen Mitternachtslauf oder etwas planen, aber in Zukunft möchte ich möglicherweise mehrere Änderungen an den Punkten abhängig von Benutzereingaben vornehmen. Grundsätzlich möchte ich jedoch eine Art Threading-Funktion verwenden.Threading Blocks Haupt in Python

Leider blockiert mein Thread den Betrieb von Main. Ich bin mir nicht sicher, warum, denn ich hatte gedacht, der ganze Punkt des Threads war, dass er gleichzeitig lief.

Hier ist, wie ich meine Funktion von Haupt nennen:

i = Inflate('pants') 
i.timermethod() 

Hier ist die Klasse und Methode ist, wie ich sie definiert haben:

from flask_restful import abort, reqparse, Resource 
from marshmallow import Schema, fields, ValidationError, pre_load 
from flask import Flask, Blueprint, request, jsonify 
from flask_cors import CORS, cross_origin 
import psycopg2 
import os 
from os.path import join, dirname 
import threading 
from time import sleep 

class Inflate: 
    def __init__(self, s): 
     self.s = s 
    def printtest(self): 
     print('insided the printtest for inflation') 
    def hello(self, h): 
     print h + self.s 
    def timermethod(self): 
     h="hello there " 
     for i in range(5): 
      t = threading.Thread(target=self.hello, args=(h,)) 
      t.start() 
      sleep(2) 

Die Ausgabe ist, dass „hallo dort Hosen“ ist 5 mal gedruckt, bevor meine Hauptfunktion ausgeführt wird, während ich erwarten würde, dass "hallo da pants" vielleicht einmal gedruckt wird, andere Ausgaben von main sehen, wie es zur gleichen Zeit läuft, und dann "hallo da pants", um weiterzumachen.

Bitte lassen Sie mich wissen, wenn Sie irgendwelche Ideen haben, bin ich fest.

+0

Sie schlafen für 2 nach jedem Thread-Start, so dass jeder von ihnen zu der Zeit, die Sie als nächstes beginnen werden, Schlaf zu entfernen, und Sie sehen Ergebnisse, die mehr mit Ihren Erwartungen übereinstimmen, aber dann wieder Ihre Threads tun so wenig, dass sie wird fertig sein, bevor du ein anderes startest, also wirst du wahrscheinlich immer noch 5 'hallo' sehen – user3012759

+0

ok, aber wie stelle ich dann alle n Sekunden eine Wartebedingung auf den Thread ein, der die Hauptleitung nicht blockiert? Ich muss einige Zeit warten, bevor ich einen anderen Thread irgendwie ausführe. –

+0

Warum müssen Sie warten? – user3012759

Antwort

1

Sie rufen i.timermethod(), die für 5 Sekunden für 5 Sekunden schläft, bevor Sie zurück.

0

Schlaf-Blöcke. Sie müssen Timer-Methode von einem separaten Thread ausführen.

Versuch:

t = Thread(target=i.timermethod) 
t.start() 

print "i will print immediately" 

# print test will run 5 times in 5 separate threads, once every 2 secs 

statt:

i.timermethod() 

# print test will run 5 times in 5 separate threads, once every 2 secs 

print "i have to wait for timermethod() to finish" 

#code that gets blocked 

von Ihrem Haupt-Thread. Sie müssen explizit sagen Python, um timermethod in einem eigenen Thread aufzurufen, sonst wird es in main laufen.

+0

ok ...... aber das löst nicht das Problem, zwischen den Ausführungszyklen etwas Zeit haben zu wollen. Wenn ich den Thread erneut ausführe, wird er sofort ausgeführt. Ich brauche einen "nicht blockierenden Schlaf". –

+0

Nein, tut es - durch Ausführen von Timer-Methode in einem eigenen Thread, wird "Schlaf" ausgeführt und blockiert daher in einem separaten Thread statt Ihr Haupt-Thread. Von seinem eigenen Thread können Sie schlafen, wie Sie wollen. –

+0

In Ihrem Code rufen Sie in Ihrem Hauptthread Schlaf und damit Blockierung auf. hoffe das macht Sinn –