Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Ταυτόχρονη εκτέλεση πολλών διαδικασιών.

Ταυτόχρονη εκτέλεση πολλών διαδικασιών. 9 Χρόνια 9 Μήνες πριν #2460

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Καλησπέρα.

Προσπαθούσα τώρα τελευταία να φτιάξω ένα πρόγραμμά
αλλά κόλλησα σε ένα περίεργο πρόβλημα.Πρέπει να
κάνω κάτι ώστε να εκτελέσω 2 διαδικασίες ταυτόχρονα!

Για παράδειγμα την ώρα που περιμένω να εισάγει κάτι ο
χρήστης, ταυτόχρονα να εμφανίζω και κάτι στην οθόνη.
Αυτό όμως είναι αδύνατον γιατί η input() παγώνει το πρόγραμμα
μέχρι να πατηθεί το έντερ.Άρα πως θα το καταφέρω αυτό;

Έψαξα λίγο στο google και βρήκα κάτι για multiprocessing
αλλά δεν κατάλαβα τίποτα.

Έχετε καμιά ιδέα;

Ευχαριστώ :)
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Ταυτόχρονη εκτέλεση πολλών διαδικασιών. 9 Χρόνια 9 Μήνες πριν #2461

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
υπάρχουν διάφοροι τρόποι για να γίνει αυτό. Συνήθως οταν περιμένουμε για Input από το χρήστη προτιμούμε threads αντί για processes γιατι είναι πιο lightweight.

Αν θες βοήθεια με κάτι πιο συγκεκριμένο, θα πρέπει να ποστάρεις κώδικα.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Ταυτόχρονη εκτέλεση πολλών διαδικασιών. 9 Χρόνια 9 Μήνες πριν #2465

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
#Server
import socket               
 
s = socket.socket()         
host = socket.gethostname() 
port = 12345                
s.bind((host, port))        
 
s.listen(5)                 
while True:
 
   c, addr = s.accept()     
   print ('Got connection from', addr)
   c.send(b'Thank you for connecting')
#client
import socket               
 
s = socket.socket()         
host = socket.gethostname() 
port = 12345                
 
s.connect((host, port))
print (s.recv(1024))
 
while True:
    print('Message:',s.recv(1000))
    s.send(input(">>> ").encode('utf-8', 'strict'))

Αυτό που προσπαθώ να κάνω ουσιαστικά είναι ένα chat mechanism αλλά στον client δεν μπορώ να στέλνω μυνήματα
και να λαμβάνω ταυτόχρονα διότι το print('Message:',s.recv(1000)) περιμένει μέχρι να στείλει
κάτι ο server και μετά μπορώ να ξαναγράψω κ.ο.κ

Πως θα καταφέρω και να στέλνω bytes αλλά και να λαμβάνω
ταυτόχρονα?

Δεν ξέρω άμα γίνετε να φτιάξω frames αλλά νομίζω ότι
τα frames δουλεύουν μόνο για παράθυρα και εικόνες.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Ταυτόχρονη εκτέλεση πολλών διαδικασιών. 9 Χρόνια 9 Μήνες πριν #2466

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Ένα άλλο παράδειγμα που μπορεί να σας φανεί περισσότερο
χρήσιμο είναι για παράδειγμα αυτό:
 
a = input(">>> ")
 
αν σε 3s δεν πληκτρολογίσει κάτι τότε:
    print("Αργήσατε να πληκτρολογίσετε.")

Δηλαδή ενώ η python περιμένει από τον χρήστη να
πληκτρολογίσει κάτι ταυτόχρονα να υπάρχει ένας
μετρητής που να μετράει σε δευτερόλεπτα και
αν ο μετρητής φτάσει στο 3 και ο χρήστης δεν
έχει πληκτρολογίσει κάτι τότε να εμφανίζει ένα μήνυμα.

Μπορεί κάποιος να με φτιάξει αυτό το πρόγραμμα;
Εγώ πάντως δεν έχω ιδέα.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Ταυτόχρονη εκτέλεση πολλών διαδικασιών. 9 Χρόνια 9 Μήνες πριν #2467

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Όπως σου είπα, αυτό που θες να κάνεις γίνεται με είτε με πολλαπλά threads, είτε με πολλαπλά processes. Επειδή στην συγκεκριμένη περίπτωση αυτό που θες να κάνεις έχει να κάνει με I/O η προτιμότερη λύση είναι τα threads

Σημείωσε πάντως ότι ο multi-threaded προγραμματισμός είναι αρκετά advanced αντικείμενο και μπορεί να γίνει ιδιαίτερα στριφνός. Tutorials θα βρεις στο ίντερνετ (πχ εδώ αλλά σου ξαναλέω ότι το θέμα δεν απευθύνεται σε τελείως αρχάριους. That being said, αυτό που θες εσύ πρέπει να ειναι σχετικά απλό.

Το δεύτερο μπορεί να γίνει εύκολα χρησιμοποιώντας ένα Timer
Δεν ξέρω άμα γίνετε να φτιάξω frames αλλά νομίζω ότι
τα frames δουλεύουν μόνο για παράθυρα και εικόνες.
Τι εννοείς με τα frames?
Τελευταία διόρθωση: 9 Χρόνια 9 Μήνες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": babaliaris1

Ταυτόχρονη εκτέλεση πολλών διαδικασιών. 9 Χρόνια 9 Μήνες πριν #2468

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
pmav99 έγραψε:
Όπως σου είπα, αυτό που θες να κάνεις γίνεται με είτε με πολλαπλά threads, είτε με πολλαπλά processes. Επειδή στην συγκεκριμένη περίπτωση αυτό που θες να κάνεις έχει να κάνει με I/O η προτιμότερη λύση είναι τα threads

Σημείωσε πάντως ότι ο multi-threaded προγραμματισμός είναι αρκετά advanced αντικείμενο και μπορεί να γίνει ιδιαίτερα στριφνός. Tutorials θα βρεις στο ίντερνετ (πχ εδώ αλλά σου ξαναλέω ότι το θέμα δεν απευθύνεται σε τελείως αρχάριους.
That being said, αυτό που θες εσύ πρέπει να ειναι σχετικά απλό.

Το δεύτερο μπορεί να γίνει εύκολα χρησιμοποιώντας ένα Timer
Δεν ξέρω άμα γίνετε να φτιάξω frames αλλά νομίζω ότι
τα frames δουλεύουν μόνο για παράθυρα και εικόνες.
Τι εννοείς με τα frames?

Σχετικά με το αρχάριος άμα εννοείς καθαρά για τον προγραμματισμό δεν νομίζω ότι είμαι.Μπορεί από αυτά που
ποστάρω να φαίνομαι αλλά γνωρίζω αρκετά καλά πως δουλεύουν
οι γλώσσες προγραμματισμού και πιστεύω πως τα βασικά της
python τα γνωρίζω, απλώς προσπαθώ να μάθω περισσότερα :p

Τώρα αυτά τα threads δεν ξέρω πόσο θα με δυσκολέψουν αλλά
θα το παλέψω.

Σχετικά με τα frames μάλλον είπα χαζομάρα γιατί στην ουσία αυτό που κάνουν είναι να παίζουν πολλές εικόνες μαζί πολύ
γρήγορα έτσι ώστε να φαίνεται για παράδειγμα μία κίνηση, όποτε βλακεία είπα.Δεν έχει σχέσει με αυτό που ήθελα να ρωτήσω.

Τέλος πάντων θα δω τη είναι τα threads και άμα έχω κάποιο
πρόβλημα θα σας ενημερώσω.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Ταυτόχρονη εκτέλεση πολλών διαδικασιών. 9 Χρόνια 9 Μήνες πριν #2469

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Για δες αυτό, μόνος το σκέφτηκα:
import threading, time
 
timer = 0
stop  = False
 
def main ():
    global stop
 
    t = threading.Thread(target = Count, name = "Count")
    t.start()
 
    #Τρέχει μέχρι ο timer να ξεπεράσει τα 3 δευτερόλεπτα.
    while (not stop):
 
        if (timer > 3):
            print("3 seconds pass")
            stop = True
 
 
 
#Thread Count (Απλός αυξάνει μια μεταβλητή μέχρι να ξεπεράσει το 3)
def Count():
    global timer
 
    while (not stop):
        time.sleep(1)
        timer += 1
 
 
if (__name__ == "__main__"):
    main()

Είναι καλό για αρχή?
Στην ουσία αυτό που πέτυχα είναι τα τρέχουν δύο while loops
ταυτόχρονα. :p
Τελευταία διόρθωση: 9 Χρόνια 9 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Ταυτόχρονη εκτέλεση πολλών διαδικασιών. 9 Χρόνια 9 Μήνες πριν #2470

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Οταν θες να γίνει κάτι μια φορά μετά από κάποιο χρόνο (πχ εδώ να γίνει η stop False), τότε καλύτερα είναι να χρησιμοποιήσεις την threading.Timer.

Από εκεί και πέρα όπως μπορείς να δεις, από εκεί και πέρα συνθήκη που θες είναι μάλλον
if (timer >= 3):
γιατί έτσι πως το έχεις ο κώδικας τρέχει για 4 δευτερόλεπτα.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Ταυτόχρονη εκτέλεση πολλών διαδικασιών. 9 Χρόνια 9 Μήνες πριν #2471

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
pmav99 έγραψε:
Οταν θες να γίνει κάτι μια φορά μετά από κάποιο χρόνο (πχ εδώ να γίνει η stop False), τότε καλύτερα είναι να χρησιμοποιήσεις την threading.Timer.

Από εκεί και πέρα όπως μπορείς να δεις, από εκεί και πέρα συνθήκη που θες είναι μάλλον
if (timer >= 3):
γιατί έτσι πως το έχεις ο κώδικας τρέχει για 4 δευτερόλεπτα.

Ουψ! Δίκαιο έχεις, δεν το πρόσεξα :p
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Ταυτόχρονη εκτέλεση πολλών διαδικασιών. 9 Χρόνια 9 Μήνες πριν #2472

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
off topic:
Αυτός ο τρόπος γραφείς προγραμμάτων στην python με θυμίζει
πάρα πολύ την c. Δηλαδή η συνάρτηση main που τρέχει πρώτη
στο πρόγραμμα και όλες οι άλλες τρέχουν μέσω αυτής. Απλός
το είδα να τον χρησημοποιούν πολύ και σκέφτηκα να το υιοθετήσω.

Θα ήθελα να ρωτήσω ποια είναι η διαφορά να γράφεις
έτσι τα προγράμματά σου.

Δηλαδή αυτό:
# -*- coding: utf-8 -*-
 
#FileName: File Name
#Made by : Nick Babaliaris
#E-mail  : babaliaris.nikos@gmail.com
 
#Importing Libraries#
import os, time, threading
#Importing Libraries#
 
#_____Variables_____#
 
#Booleans
running = True
 
#_____Variables_____#
 
 
#====================Main Function====================#
def Main():
    pass
#====================Main Function====================#
 
 
 
#Start the Main Function.
if (__name__ == "__main__"):
    Main()
Τελευταία διόρθωση: 9 Χρόνια 9 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Ταυτόχρονη εκτέλεση πολλών διαδικασιών. 9 Χρόνια 9 Μήνες πριν #2473

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
γενικά η python είναι βασισμένη / επηρεασμένη σε πολλά πράγματα από την C.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Ταυτόχρονη εκτέλεση πολλών διαδικασιών. 9 Χρόνια 9 Μήνες πριν #2474

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Όντος δίκαιο έχεις.
Έχω αρχίσει να μαθαίνω c αλλά με δυσκολεύει πάρα πολύ αν
και έχω ένα πάρα πολύ καλό βιβλίο.

Όπως και να έχει όμως σαν την python δεν έχει.Μπορεί
ο προγραμματιστής να έχει μεγαλύτερο έλεγχο με την c
αλλά σαν την python δεν :)

Αυτά που μπορώ να κάνω στην python δεν μπορώ ούτε να φανταστώ
πως να τα κάνω στην c :p
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.415 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου